當前位置:首頁 » 編程語言 » sql違約處理規則
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql違約處理規則

發布時間: 2023-07-26 22:54:38

㈠ 如何在sql存儲過程中處理錯誤

一、存儲過程中使用事務的簡單語法
在存儲過程中使用事務時非常重要的,使用數據可以賀銷保持數據的關聯完整性,在Sql server存儲過程中使用事務也很簡單,用一個例子來說明它的語法格式:
Create Procere MyProcere
( @Param1 nvarchar(10),
@param2 nvarchar(10)
)
AS
Begin
Set NOCOUNT ON;
Set XACT_ABORT ON;
Begin Tran
Delete from table1 where name=』abc』;
Insert into table2 values(value1,value2,value3);
Commit Tran
End

說明:
1 、使用存儲過程執行事物,需要開啟XACT_ABORT參數(默認值為Off),將該參數設置為On,表示當執行事務時,如果出錯,會將transcation設置為uncommittable狀態,那麼在語句塊批處理結束後將回滾所有操作;如果該參數設置為Off,表示當執行事務時,如果出錯,出錯的語句將不會執行,其他正確的操作繼續執行。

2、當SET NOCOUNT 為 ON 時,不返回計數(計數表示受 Transact-SQL 語句影響的行數,例如在Sql server查詢分析器中執行一個delete操作後,下方窗口會提示(3)Rows Affected)。當 SET NOCOUNT 為 OFF 時,返回計數,我們應該在存儲過程的頭部加上SET NOCOUNT ON 這樣的話,在退出存儲過程的時候加上 SET NOCOUNT OFF這樣的話,以達到優化存儲過程的目的。

二、事務內設置保存點
用戶可以在事務內設置保存點或標記。保存點定義如果有條件地取消事務的一部分,事務可以返回的位置。如果將事務回滾到保存點,則必須(如果需要,使用更多的 Transact-SQL 語句和 COMMIT TRANSACTION 語句)繼續完成事務,或者必須(通過將事務回滾到其起始點)完全取消事務。若要取消整個事務,請使用 ROLLBACK TRANSACTION transaction_name 格式。這將撤消事務的所有語句和過程。如:
代碼
Create Procere MyProcere
AS
Begin
Set NOCOUNT ON;
Set XACT_ABORT ON;
begin tran ok --開始一個事務OK
delete from rxqz where qz= 'rx015 ' --刪除數據
save tran bcd --保存一個事務點命名凱肆為bcd
update sz set name='李麗s' where name= '李麗'--修改數據

if @@error<>0 --判斷修改數據有沒有出錯
begin --如果出錯
rollback tran bcd -- 回滾事務到BCD 的還原點
commit tran ok --提交事務
end
else --沒有出錯
commit tran ok --提交事務
End

說明:1、@@error判斷是否有錯誤,為0表示沒有盯拍轎錯誤,但是對那種重大錯誤無法捕捉,而且@@error只能前一句sql語句生效。

三、存儲過程使用try…catch捕獲錯誤
在存儲過程中可以使用try…catch語句來捕獲錯誤,如下:

Create Procere MyProcere
( @Param1 nvarchar(10),
@param2 nvarchar(10)
)
AS
Begin
Set NOCOUNT ON;
Begin try
Delete from table1 where name=』abc』;
Insert into table2 values(value1,value2,value3);
End try
Begin Catch
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage;
End Catch
End

說明:1、捕獲錯誤的函數有很多,如下:
ERROR_NUMBER() 返回錯誤號。
ERROR_SEVERITY() 返回嚴重性。
ERROR_STATE() 返回錯誤狀態號。
ERROR_PROCEDURE() 返回出現錯誤的存儲過程或觸發器的名稱。
ERROR_LINE() 返回導致錯誤的常式中的行號。
ERROR_MESSAGE() 返回錯誤消息的完整文本。該文本可包括任何可替換參數所提供的值,如長度、對象名或時間。
2、有些錯誤,如sql語句中的表名稱輸入錯誤,這是資料庫引擎無法解析這個表名稱時,所發生的錯誤在當前的try…catch語句中無法捕獲,必須由外層調用該存儲過程的地方使用 try…catch來進行捕獲。

四、存儲過程中事務和try…catch聯合使用
在存儲過程中使用事務時,如果沒有try…catch語句,那麼當set xact_abort on時,如果有錯誤發生,在批處理語句結束後,系統會自動回滾所有的sql操作。當set xact_abort off時,如果有錯誤發生,在批處理語句結束後,系統會執行所有沒有發生錯誤的語句,發生錯誤的語句將不會被執行。
在存儲過程中使用事務時,如果存在try…catch語句塊,那麼當捕獲到錯誤時,需要在catch語句塊中手動進行Rollback操作,否則系統會給客戶端傳遞一條錯誤信息。如果在存儲過程開始處將set xact_abort on,那麼當有錯誤發生時,系統會將當前事務置為不可提交狀態,即會將xact_state()置為-1,此時只可以對事務進行Rollback操作,不可進行提交(commit)操作,那麼我們在catch語句塊中就可以根據xact_state()的值來判斷是否有事務處於不可提交狀態,如果有則可以進行rollback操作了。如果在存儲過程開始處將set xact_abort off,那麼當有錯誤發生時,系統不會講xact_state()置為-1,那麼我們在catch塊中就不可以根據該函數值來判斷是否需要進行rollback了,但是我們可以根據@@Trancount全局變數來判斷,如果在catch塊中判斷出@@Trancount數值大於0,代表還有未提交的事務,既然進入catch語句塊了,那麼還存在未提交的事務,該事務應該是需要rollback的,但是這種方法在某些情況下可能判斷的不準確。推薦的方法還是將set xact_abort on,然後在catch中判斷xact_state()的值來判斷是否需要Rollback操作。
下面我們來看看兩個例子:
一.使用Set xact_abort on

Create proc myProcere
As
begin
set xact_abort on;
begin try
begin tran
insert into TestStu values('Terry','boy',23);
insert into TestStu values('Mary','girl',21);
commit tran
end try
begin catch
--在此可以使用xact_state()來判斷是否有不可提交的事務,不可提交的事務
--表示在事務內部發生錯誤了。Xact_state()有三種值:-1.事務不可提交;
--1.事務可提交;0.表示沒有事務,此時commit或者rollback會報錯。
if xact_state()=-1
rollback tran;
end catch
end

二.使用Set xact_abort off

Create proc myProcere
As
begin
set xact_abort off;
begin try
begin tran
insert into TestStu values('Terry','boy',23);
insert into TestStu values('Mary','girl',21);
commit tran
end try
begin catch
--在此不可以使用xact_state來判斷是否有不可提交的事務
--只可以使用@@Trancount來判斷是否有還未提交的事務,未提交的事務未必
--就是不可提交的事務,所以使用@@TranCount>0後就RollBack是不準確的
if @@TranCount>0
rollback tran;
end catch
end

另外,對於@@Trancount需要說明的是,begin tran 語句將 @@Trancount加 1。Rollback tran將 @@Trancount遞減到 0,但 Rollback tran savepoint_name 除外,它不影響 @@Trancount。Commit tran 或 Commit work 將 @@Trancount 遞減 1。

㈡ sql server中的規則是什麼 如何定義速回有加分!

CREATE RULE (Transact-SQL)

創建名為規則的對象。當綁定到列或別名數據類型時,使用規則指定可以插入到列中的可接受的值。

重要提示:
後續版本的 Microsoft SQL Server 將刪除該功能。請避免在新的開發工作中使用該功能,並著手修改當前還在使用該功能的應用程序。建議您改用檢查約束。檢查約束是使用 CREATE TABLE 或 ALTER TABLE 的 CHECK 關鍵字創建的。有關詳細信息,請參閱 CHECK 約束。

列或別名數據類型只能被綁定一個規則。不過,列可以同時有一個規則以及一個或多個檢查約束與其相關聯。在這種情況下,將評估所有限制。

Transact-SQL 語法約定

語法

CREATE RULE [ schema_name . ] rule_name
AS condition_expression
[ ; ]

參數
schema_name
規則所屬架構的名稱。

rule_name
新規則的名稱。規則名稱必須符合標識符規則。根據需要,指定規則所有者名稱。

condition_expression
定義規則的條件。規則可以是 WHERE 子句中任何有效的表達式,並且可以包括諸如算術運算符、關系運算符和謂詞(如 IN、LIKE、BETWEEN)這樣的元素。規則不能引用列或其他資料庫對象。可以包括不引用資料庫對象的內置函數。不能使用用戶定義函數。

condition_expression 包括一個變數。每個局部變數的前面都有一個 at 符號 (@)。該表達式引用通過 UPDATE 或 INSERT 語句輸入的值。在創建規則時,可以使用任何名稱或符號表示值,但第一個字元必須是 at 符號 (@)。

注意:
請避免對使用別名數據類型的表達式創建規則。雖然可以對使用別名數據類型的表達式創建規則,但在將規則綁定到列或別名數據類型後,表達式被引用時將無法對其進行編譯。

㈢ 求SQL語法,就語法不要文字

1.創建表

(1)用Create Table 命令創建表

語法:

Create Table tabl_name

({

}column_name As computed_column_expression

}

}[,...n]

)

[On {fiegroup | Default}]

[Textimage_On {fiegroup | Default}]

例子:

打開cust資料庫,創建一個表,該表包含了學生的有關信息,即有學號、姓名、性別、出生日期、籍貫、聯系電話、住址和備注信息。

Use cust

Create Table students

(

number int not null,

name varchar(10) not null,

sex char(2) null,

birthday datetime null,

hometown varchar(30) null,

telphone_no varchar(12) null,

address varchar(30) null,

others varchar(50) null

)

在這個表中number表示學生代號,數據類型為int,不允許為空;name表示學生姓名,數據類型為varchar,長度為10,不允許為空;sex表示學生的性別,數據類型為char,長度為2,允許為空;birthday表示學生的出生日期,數據類型為datetime,允許為空;hometown表示學生的籍貫,數據類型為varchar,長度為30,允許為空;telephone_no表示學生的聯系電腦,數據類型為varchar,長度為12,允許為空;address表示學生的住址,數據類型為varchar,長度為30,允許為空;others表示學生的備注信息,長度為50,允許為空。

2.修改表的結構

(1)使用T-SQL語句增加和刪除一個新列

語法:

Alter Table table

{

ADO

{[]

|colun_name As computed_column_expression

|[]

}[,...n]

|Drop

{Column column

}[,...n]

}

例子:打開cust資料庫,修改其中的表students的結構,增加一個新欄位,欄位名為ying,數據類型是varchar,長度是10,沒有默認值,充許為空。

Use cust

Alter Table students Add ying varchar(10) null

打開cust資料庫,修改其中的表students的結構,刪除一個欄位,欄位名為ying。

Use cust

Alter Table students Drop Column ying

3.向表中插入數據

(1)用 Insert 語句

語法如下:

Insert [Into]

{table_name|view_name}[(column_list)]

{Values|values_list|select_statement}

注意:在插入數據時,字元數據和日期數據要使用引號引起來。

例子:

Use cust

Insert Into students

Values (11,"影子","男","1999-12-12","湖北","83779805","武漢市橋口區","VB愛好者")

打開cust資料庫,向students表中插入數據

(2)用Default 選項

在插入數據時,可以使用Default選項。Default選項有兩種形式,一種形式是Default Values,另一種是Default。

Default Values
形式為表中的某一行的所有列插入默認值。使用這種形式的前提條件是表中的所有列必須是這四種類型之一:Identity屬性,Timestamp數據類型,允許為Null,或者有一個指定的默認值。否則,會錯誤信息。

例子:

Use cust

Insert Into students Default Values

這個例子會出現錯誤,因為students表的number欄位是設置為不允許為空的。

Default 形式是為表中的某一列插入默認值。要插入的該列必須具備一定的條件,即該列要麼是Timestamp
數據類型,要麼是允許為Null,要麼是有一個指定的默認值,否則,會出現錯誤信息。

例子:

Use cust

Insert Into students
Values(11,"影子",Default,Default,Default,Default,Default,Default)

由天前2個欄位不能為空,所以要賦值,否則會出現錯誤,而後面的6個欄位允許為空,因此可以調用Default默認。

(3)插入部分數據

在使用Insert語句插入數據是,還可以插入部分數據,也就是可以為每一行的指定的部分列插入數據。在插入部分數據時,應該注意以下三個問題:

☆在 Insert 子句中,指定要插入數據的列名。

☆在 Values 子句中,列出與列名對應的數據。列名的順序和數據的順序應該完全對應。

☆在 Insert 子句中,沒有列出的列應該至少具有這四種類型之一:Identtty 屬性,Timestamp 數據類型,允許為
Null,或者有一個指定的默認值。否則,會出現錯誤信息。

例子:

Use cust

Insert Into students (number,name)

Values (110,"影子")

打開cust資料庫,向students表中插入一行數據

注意:如用下例語句將發生錯誤,因為name欄位是不允許為空的(在創建資料庫時設定的)

Insert Into students (number)

Values (110)

(4)用 Select 語句插入多條數據

Insert 語句插入數據的特點是每一次只能插入一行數據。相反,Select 也可以用在 Insert 語句中,並且可以一次插入多條數據。使用 Select
語句插入數據的語法形式如下:

Insert table_name

Select column_list

From table_list

Where search_conditions

在使用 Select 語句插入數據時,應該注意下面幾點:

☆在 Insert 語句中使用 Select 時,他們參考的表既可以是相同的,也可以是不同的。

☆要插入數據的表必須已經存在。

☆要插入數據的表必須和 Select 的結果集兼容。兼容的含義是列的數量和順序必須相同,列的數據類型或者相同,或者SQL Server 可以自動轉換。

例子:

Use cust

Insert students

Select number,name,sex,birthday,hometown,telphone_no,address,others

From students

注意:

Select 後面的欄位要輸完整,這個例子是自己向自己插入多條數據(自己向自己插入是被允許的)

補充:

你還可以「From students」後面加上「Where name="影子"」,只插入name等於影子的記錄,可以用And 和 Or 加上多個條件。

(5)使用 Select Into 插入數據到一個新表中

帶有 Into 子句的 Select
語句允許用戶定義一個新表並且把數據插入到新表中。這種方法不同於前面講述的那些方法。在前面的那些方法中,一個共同的特點,是在數據輸入之前表已經存在。而使用
Select Into 插入數據的方法,是在插入數據的過程中建立新表。

Select Into 語句的語法如下:

Select select_list

Into new_table_name

From table_list

Where search_conditions

在使用 Select Into 插入數據時,要注意下面幾點:

☆在某個資料庫中使用 Select Into 插入數據時,設置該資料庫的 Select Into/Bulk Copy 為真。

☆新表不能存在,否則會產生錯誤信息。

☆新表中的列和行是基於查詢結果集

☆要插入的數據不記錄在日誌中。

☆在select_list 中出現的列應該使用別名,否則,新表中的列沒有列名。沒列名的表只能通過 Select * From new_table_name
的形式查詢。因此,應該為列起個別名。

☆這種方法多用在對列進行各種計算的情況。

例子:

Select number,name

Into newcust1

From students

創建新的表newcust1,插入students表中的number和name欄位的所有數據。

補充:如果要插入所有欄位的記錄,則「Select *」,也可在「From students」後加條件,方法和上個例子一樣。

(6)用 UPdate 語句修改表中的數據

Update 語句用來修改表中已存在的數據。Update 語句既可以一次修改一行數據,也可以一次修改許多行,甚至可以一次修改表中的全部數據。Update
語句使用 Where 子句指定要修改的行,使用 Set 子句給出新的數據。新數據可以是常量,也可以是指定的表達式,還可以是使用 From 子句來自其他表的數據。

Update 語句的語法如下:

Update {table_name|view_name}

Set {column_list}=expression [,. . .]

[Where clause]

在使用 Update 語句時,如果沒有使用 Where 子句,那麼就對表中所有的行進行修改。如果使用Update
語句修改數據時與數據完整性約束有沖突,那麼修改就不會發生,整個修改事務全部滾回。例如,這種沖突可能是所輸入的值是錯誤的數據類型,或者所輸入的值違背了在該列定義的規則約束,等等。

例子:

Use cust

Update students

Set name=name+"007"

Where number>100

打開cust資料庫,修改students表,使number>100的數據的name的值全部加"007"。

4.用 Delete 語句刪除表中的數據

當資料庫中的數據不需要的進修可以刪除。一般情況下,刪除數據使用 Delete 語句。Delete 語句可以一次
回答者: yeqiezi - 高級經理 六級 2-5 08:46
我來評論>>
評價已經被關閉 目前有 1 個人評價

0% (0)不好
100% (1)
相關內容
• 誰能把SQL的入門以及下載地址和基本操作詳細說下謝謝
• 誰能幫我做一個以SQL的資料庫為底本,用C,C++或VB實...
• access導入MSSQL 後查詢表不能正常怎麼辦
• Sql存儲過程問題,求高手解決
• SQL Server 2005資料庫管理與應用高手修煉指南 pdf 下載
更多相關問題>>
查看同主題問題:基本操作
其他回答 共 3 條
select
回答者: catjj1748 - 魔法師 五級 2-5 08:52
1、說明:創建資料庫

CREATE DATABASE database-name

2、說明:刪除資料庫

drop database dbname

3、說明:備份sql server

--- 創建 備份數據的 device

USE master

EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

--- 開始 備份

BACKUP DATABASE pubs TO testBack

4、說明:創建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not
null],..)

根據已有的表創建新表:

A:create table tab_new like tab_old (使用舊表創建新表)

B:create table tab_new as select col1,col2… from tab_old definition only

5、說明:

刪除新表:drop table tabname

6、說明:

增加一個列:Alter table tabname add column col type

註:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。

7、說明:

添加主鍵:Alter table tabname add primary key(col)

說明:

刪除主鍵:Alter table tabname drop primary key(col)

8、說明:

創建索引:create [unique] index idxname on tabname(col….)

刪除索引:drop index idxname

註:索引是不可更改的,想更改必須刪除重新建。

9、說明:

創建視圖:create view viewname as select statement

刪除視圖:drop view viewname

10、說明:幾個簡單的基本的sql語句

選擇:select * from table1 where 范圍

插入:insert into table1(field1,field2) values(value1,value2)

刪除:delete from table1 where 范圍

更新:update table1 set field1=value1 where 范圍

查找:select * from table1 where field1 like 』%value1%』 ---like的語法很精妙,查資料!

排序:select * from table1 order by field1,field2 [desc]

總數:select count * as totalcount from table1

求和:select sum(field1) as sumvalue from table1

平均:select avg(field1) as avgvalue from table1

最大:select max(field1) as maxvalue from table1

最小:select min(field1) as minvalue from table1

11、說明:幾個高級查詢運算詞

A: UNION 運算符

UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。當 ALL 隨 UNION
一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。

B: EXCEPT 運算符

EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重復行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時
(EXCEPT ALL),不消除重復行。

C: INTERSECT 運算符

INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALL 隨 INTERSECT
一起使用時 (INTERSECT ALL),不消除重復行。

註:使用運算詞的幾個查詢結果行必須是一致的。

12、說明:使用外連接

A、left outer join:

左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right outer join:

右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。

C:full outer join:

全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。

其次,大家來看一些不錯的sql語句

1、說明:復製表(只復制結構,源表名:a 新表名:b) (Access可用)

法一:select * into b from a where 1<>1

法二:select top 0 * into b from a

2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

3、說明:跨資料庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)

insert into b(a, b, c) select d,e,f from b in 『具體資料庫』 where 條件

例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、說明:子查詢(表名1:a 表名2:b)

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where
a IN (1,2,3)

5、說明:顯示文章、提交人和最後回復時間

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate
from table where table.title=a.title) b

6、說明:外連接查詢(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、說明:在線視圖查詢(表名1:a )

select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、說明:between的用法,between限制查詢數據范圍時包括了邊界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 數值1 and 數值2

9、說明:in 的使用方法

select * from table1 where a [not] in (『值1』,』值2』,』值4』,』值6』)

10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息

delete from table1 where not exists ( select * from table2 where
table1.field1=table2.field1 )

11、說明:四表聯查問題:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner
join d on a.a=d.d where .....

12、說明:日程安排提前五分鍾提醒

SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5

13、說明:一條sql 語句搞定資料庫分頁

select top 10 b.* from (select top 20 主鍵欄位,排序欄位 from 表名 order by 排序欄位 desc) a,表名
b where b.主鍵欄位 = a.主鍵欄位 order by a.排序欄位

14、說明:前10條記錄

select top 10 * form table1 where 范圍

15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where
tb.b=ta.b)

16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重復行而派生出一個結果表

(select a from tableA ) except (select a from tableB) except (select a from
tableC)

17、說明:隨機取出10條數據

select top 10 * from tablename order by newid()

18、說明:隨機選擇記錄

select newid()

19、說明:刪除重復記錄

Delete from tablename where id not in (select max(id) from tablename group by
col1,col2,...)

20、說明:列出資料庫里所有的表名

select name from sysobjects where type='U'

21、說明:列出表裡的所有的

select name from syscolumns where id=object_id('TableName')

22、說明:列示type、vender、pcs欄位,以type欄位排列,case可以方便地實現多重選擇,類似select 中的case。

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when
'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM
tablename group by type

顯示結果:

type vender pcs

電腦 A 1

電腦 A 1

光碟 B 2

光碟 A 2

手機 B 3

手機 C 3

23、說明:初始化表table1

TRUNCATE TABLE table1

24、說明:選擇從10到15的記錄

select top 5 * from (select top 15 * from table order by id asc) table_別名 order
by id desc

隨機選擇資料庫記錄的方法(使用Randomize函數,通過SQL語句實現)

對存儲在資料庫中的數據來說,隨機數特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP「找個隨機數」然後列印出來。實際上常見的解決方案是建立如下所示的循環:

Randomize

RNumber = Int(Rnd*499) +1

While Not objRec.EOF

If objRec("ID") = RNumber THEN

... 這里是執行腳本 ...

end if

objRec.MoveNext

Wend

這很容易理解。首先,你取出1到500范圍之內的一個隨機數(假設500就是資料庫內記錄的總數)。然後,你遍歷每一記錄來測試ID
的值、檢查其是否匹配RNumber。滿足條件的話就執行由THEN 關鍵字開始的那一塊代碼。假如你的RNumber
等於495,那麼要循環一遍資料庫花的時間可就長了。雖然500這個數字看起來大了些,但相比更為穩固的企業解決方案這還是個小型資料庫了,後者通常在一個資料庫內就包含了成千上萬條記錄。這時候不就死定了?

採用SQL,你就可以很快地找出准確的記錄並且打開一個只包含該記錄的recordset,如下所示:

Randomize

RNumber = Int(Rnd*499) + 1

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber

set objRec = ObjConn.Execute(SQL)

Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")

不必寫出RNumber
和ID,你只需要檢查匹配情況即可。只要你對以上代碼的工作滿意,你自可按需操作「隨機」記錄。Recordset沒有包含其他內容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時間。

再談隨機數

現在你下定決心要榨乾Random 函數的最後一滴油,那麼你可能會一次取出多條隨機記錄或者想採用一定隨機范圍內的記錄。把上面的標准Random
示例擴展一下就可以用SQL應對上面兩種情況了。

為了取出幾條隨機選擇的記錄並存放在同一recordset內,你可以存儲三個隨機數,然後查詢資料庫獲得匹配這些數字的記錄:

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 &
" OR ID = " & RNumber3

假如你想選出10條記錄(也許是每次頁面裝載時的10條鏈接的列表),你可以用BETWEEN
或者數學等式選出第一條記錄和適當數量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 SELECT 語句只顯示一種可能(這里的ID 是自動生成的號碼):

SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber
& "+ 9"

注意:以上代碼的執行目的不是檢查資料庫內是否有9條並發記錄。

隨機讀取若干條記錄,測試過

Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id)

Sql server:select top n * from 表名 order by newid()

mysql select * From 表名 Order By rand() Limit n

Access左連接語法(最近開發要用左連接,Access幫助什麼都沒有,網上沒有Access的SQL說明,只有自己測試, 現在記下以備後查)

語法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on
table1.fd1,table2.fd1 where ...

使用SQL語句 用...代替過長的字元串顯示

語法:

SQL資料庫:select case when len(field)>10 then left(field,10)+'...' else field end
as news_name,news_id from tablename

Access資料庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;

Conn.Execute說明

Execute方法

該方法用於執行SQL語句。根據SQL語句執行後是否返回記錄集,該方法的使用格式分為以下兩種:

1.執行SQL查詢語句時,將返回查詢得到的記錄集。用法為:

Set 對象變數名=連接對象.Execute("SQL 查詢語言")

Execute方法調用後,會自動創建記錄集對象,並將查詢結果存儲在該記錄對象中,通過Set方法,將記錄集賦給指定的對象保存,以後對象變數就代表了該記錄集對象。

2.執行SQL的操作性語言時,沒有記錄集的返回。此時用法為:

連接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option]

•RecordAffected
為可選項,此出可放置一個變數,SQL語句執行後,所生效的記錄數會自動保存到該變數中。通過訪問該變數,就可知道SQL語句隊多少條記錄進行了操作。

•Option
可選項,該參數的取值通常為adCMDText,它用於告訴ADO,應該將Execute方法之後的第一個字元解釋為命令文本。通過指定該參數,可使執行更高效。

•BeginTrans、RollbackTrans、CommitTrans方法

這三個方法是連接對象提供的用於事務處理的方法。BeginTrans用於開始一個事物;RollbackTrans用於回滾事務;CommitTrans用於提交所有的事務處理結果,即確認事務的處理。

事務處理可以將一組操作視為一個整體,只有全部語句都成功執行後,事務處理才算成功;若其中有一個語句執行失敗,則整個處理就算失敗,並恢復到處里前的狀態。

BeginTrans和CommitTrans用於標記事務的開始和結束,在這兩個之間的語句,就是作為事務處理的語句。判斷事務處理是否成功,可通過連接對象的Error集合來實現,若Error集合的成員個數不為0,則說明有錯誤發生,事務處理失敗。Error集合中的每一個Error對象,代表一個錯誤信息。

㈣ sql出現19011錯誤事件,怎麼處理

事件ID:19011的錯誤
描述為
SuperSocket 信息: gethostbyname(MSAFD Tcpip [TCP/IP]) : Error 11004。

在網上大多數的處理辦法是卸載SQL SERVER再重裝,我認為這是治標不治本的

處理方法:
在注冊表中找到了鍵值
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\【實例名】\SuperSocketNetLib\Np
居然還是老的計算機名\\\\.\\pipe\\$$\\**********\\sql\\query
參考另一台正常機器的資料庫,把這里修改為\\.\pipe\sql\query (集群等情況可能會不一樣,請備份後再修改)
重啟SQL SERVER服務,連接成功!
估計這里也可以在【開始】——【程序】——【Microsoft SQL Server】——【伺服器網路實用工具】——【命名管道】——【屬性】里修改

這時已經不影響使用了,但在*:\Program Files\Microsoft SQL Server\MSSQL\log\ERRORLOG看到log里的計算機名稱還是老名字,頓感不爽
刪除注冊表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLSERVER\Environment後,log恢復正常

㈤ 解釋SQL語句功能 越詳細越好

就是創建一個新的資料庫,自己看看幫助很簡單的!

語法
CREATE DATABASE database_name
[ ON
[ < filespec > [ ,...n ] ]
[ , < filegroup > [ ,...n ] ]
]
[ LOG ON { < filespec > [ ,...n ] } ]
[ COLLATE collation_name ]
[ FOR LOAD | FOR ATTACH ]

< filespec > ::=

[ PRIMARY ]
( [ NAME = logical_file_name , ]
FILENAME = 'os_file_name'
[ , SIZE = size ]
[ , MAXSIZE = { max_size | UNLIMITED } ]
[ , FILEGROWTH = growth_increment ] ) [ ,...n ]

< filegroup > ::=

FILEGROUP filegroup_name < filespec > [ ,...n ]

參數
database_name

新資料庫的名稱。資料庫名稱在伺服器中必須唯一,並且符合標識符的規則。database_name 最多可以包含 128 個字元,除非沒有為日誌指定邏輯名。如果沒有指定日誌文件的邏輯名,則 Microsoft® SQL Server™ 會通過向 database_name 追加後綴來生成邏輯名。該操作要求 database_name 在 123 個字元之內,以便生成的日誌文件邏輯名少於 128 個字元。

ON

指定顯式定義用來存儲資料庫數據部分的磁碟文件(數據文件)。當後跟以逗號分隔的用以定義主文件組的數據文件的 <filespec> 項列表時,該關鍵字是必需的。主文件組的文件列表後可跟以逗號分隔的 <filegroup> 項列表(可選),<filegroup> 項用以定義用戶文件組及其文件。

n

佔位符,表示可以為新資料庫指定多個文件。

LOG ON

指定顯式定義用來存儲資料庫日誌的磁碟文件(日誌文件)。該關鍵字後跟以逗號分隔的用以定義日誌文件的 <filespec> 項列表。如果沒有指定 LOG ON,則會自動創建一個日誌文件,其名稱由系統生成,大小為下列兩個值中的較大者:0.5 MB 和資料庫中所有數據文件大小總和的 25%。

FOR LOAD

支持該子句是為了與早期版本的 Microsoft SQL Server 兼容。資料庫在打開 dbo use only 資料庫選項的情況下創建,並且將其狀態設置為正在裝載。SQL Server 7.0 版中不需要該子句,因為 RESTORE 語句可以作為還原操作的一部分重新創建資料庫。

FOR ATTACH

指定從現有的一組操作系統文件中附加資料庫。必須有指定第一個主文件的 <filespec> 條目。至於其它 <filespec> 條目,只需要與第一次創建資料庫或上一次附加資料庫時路徑不同的文件的那些條目。必須為這些文件指定 <filespec> 條目。附加的資料庫必須使用與 SQL Server 相同的代碼頁和排序次序創建。應使用 sp_attach_db 系統存儲過程,而不要直接使用 CREATE DATABASE FOR ATTACH。只有必須指定 16 個以上的 <filespec> 項目時,才需要使用 CREATE DATABASE FOR ATTACH。

如果將資料庫附加到的伺服器不是該資料庫從中分離的伺服器,並且啟用了分離的資料庫以進行復制,則應該運行 sp_removedbreplication 從資料庫刪除復制。

collation_name

指定資料庫的默認排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。如果沒有指定排序規則,則將 SQL Server 實例的默認排序規則指派為資料庫的排序規則。

有關 Windows 和 SQL 排序規則名稱的更多信息,請參見 COLLATE。

PRIMARY

指定關聯的 <filespec> 列表定義主文件。主文件組包含所有資料庫系統表。還包含所有未指派給用戶文件組的對象。主文件組的第一個 <filespec> 條目成為主文件,該文件包含資料庫的邏輯起點及其系統表。一個資料庫只能有一個主文件。如果沒有指定 PRIMARY,那麼 CREATE DATABASE 語句中列出的第一個文件將成為主文件。

NAME

為由 <filespec> 定義的文件指定邏輯名稱。如果指定了 FOR ATTACH,則不需要指定 NAME 參數。

logical_file_name

用來在創建資料庫後執行的 Transact-SQL 語句中引用文件的名稱。logical_file_name 在資料庫中必須唯一,並且符合標識符的規則。該名稱可以是字元或 Unicode 常量,也可以是常規標識符或定界標識符。

FILENAME

為 <filespec> 定義的文件指定操作系統文件名。

'os_file_name'

操作系統創建 <filespec> 定義的物理文件時使用的路徑名和文件名。os_file_name 中的路徑必須指定 SQL Server 實例上的目錄。os_file_name 不能指定壓縮文件系統中的目錄。

如果文件在原始分區上創建,則 os_file_name 必須只指定現有原始分區的驅動器字母。每個原始分區上只能創建一個文件。原始分區上的文件不會自動增長;因此,os_file_name 指定原始分區時,不需要指定 MAXSIZE 和 FILEGROWTH 參數。

SIZE

指定 <filespec> 中定義的文件的大小。如果主文件的 <filespec> 中沒有提供 SIZE 參數,那麼 SQL Server 將使用 model 資料庫中的主文件大小。如果次要文件或日誌文件的 <filespec> 中沒有指定 SIZE 參數,則 SQL Server 將使文件大小為 1 MB。

size

<filespec> 中定義的文件的初始大小。可以使用千位元組 (KB)、兆位元組 (MB)、千兆位元組 (GB) 或兆兆位元組 (TB) 後綴。默認值為 MB。指定一個整數,不要包含小數位。size 的最小值為 512 KB。如果沒有指定 size,則默認值為 1 MB。為主文件指定的大小至少應與 model 資料庫的主文件大小相同。

MAXSIZE

指定 <filespec> 中定義的文件可以增長到的最大大小。

max_size

<filespec> 中定義的文件可以增長到的最大大小。可以使用千位元組 (KB)、兆位元組 (MB)、千兆位元組 (GB) 或兆兆位元組 (TB) 後綴。默認值為 MB。指定一個整數,不要包含小數位。如果沒有指定 max_size,那麼文件將增長到磁碟變滿為止。

說明 在磁碟即將變滿時,Microsoft Windows NT® S/B 系統日誌會警告 SQL Server 系統管理員。

UNLIMITED

指定 <filespec> 中定義的文件將增長到磁碟變滿為止。

FILEGROWTH

指定 <filespec> 中定義的文件的增長增量。文件的 FILEGROWTH 設置不能超過 MAXSIZE 設置。

growth_increment

每次需要新的空間時為文件添加的空間大小。指定一個整數,不要包含小數位。0 值表示不增長。該值可以 MB、KB、GB、TB 或百分比 (%) 為單位指定。如果未在數量後面指定 MB、KB 或 %,則默認值為 MB。如果指定 %,則增量大小為發生增長時文件大小的指定百分比。如果沒有指定 FILEGROWTH,則默認值為 10%,最小值為 64 KB。指定的大小舍入為最接近的 64 KB 的倍數。

注釋
使用一條 CREATE DATABASE 語句即可創建資料庫以及存儲該資料庫的文件。SQL Server 分兩步實現 CREATE DATABASE 語句:

SQL Server 使用 model 資料庫的復本初始化資料庫及其元數據。

然後,SQL Server 使用空頁填充資料庫的剩餘部分,除了包含記錄資料庫中空間使用情況以外的內部數據頁。
因此,model 資料庫中任何用戶定義對象均復制到所有新創建的資料庫中。可以向 model 資料庫中添加任何對象,例如表、視圖、存儲過程、數據類型等,以將這些對象添加到所有資料庫中。

每個新資料庫都從 model 資料庫繼承資料庫選項設置(除非指定了 FOR ATTACH)。例如,在 model 和任何創建的新資料庫中,資料庫選項 select into/bulk 都設置為 OFF。如果使用 ALTER DATABASE 更改 model 資料庫的選項,則這些選項設置會在創建的新資料庫中生效。如果在 CREATE DATABASE 語句中指定了 FOR ATTACH,則新資料庫將繼承原始資料庫的資料庫選項設置。

一台伺服器上最多可以指定 32,767 個資料庫。

有三種類型的文件用來存儲資料庫:

主文件包含資料庫的啟動信息。主文件還可以用來存儲數據。每個資料庫都包含一個主文件。

次要文件保存所有主要數據文件中容納不下的數據。如果主文件大到足以容納資料庫中的所有數據,就不需要有次要數據文件。而另一些資料庫可能非常大,需要多個次要數據文件,也可能使用多個獨立磁碟驅動器上的次要文件,以將數據分布在多個磁碟上。

事務日誌文件保存用來恢復資料庫的日誌信息。每個資料庫必須至少有一個事務日誌文件(盡管可以有多個)。事務日誌文件最小為 512 KB。
每個資料庫至少有兩個文件,一個主文件和一個事務日誌文件。

盡管 'os_file_name' 可以是任何有效的操作系統文件名,但如果使用以下建議的擴展名,則可以更加清楚地反映文件的用途。

文件類型 文件擴展名
主要數據文件 .mdf
次要數據文件 .ndf
事務日誌文件 .ldf

㈥ 請教sql問題,高手回答啊!!!!!下面的語句啥意思,尤其那個雙豎杠...

雙豎杠是字元串連接符號
'GRANT SELECT ON ' || TABLE_NAME || ' TO BRANDON;'
相當於(假設TABLE_NAME的值為「表名」)
'GRANT SELECT ON 表名 TO BRANDON;'
這里因為表名是變數,所以只能寫成用||連接的形式。

其他是些設置顯示方面的設置
set heading off——不顯示每行的列名
set echo off——不重復顯示所要執行的sql語句
set feedback off——不顯示sql語句的運行結果
SPOOL GRANTS.SQL——將屏幕顯示的結果輸出到GRANTS.SQL文件