declaretablesql
A. declare 在sql中是什麼意思,怎麼用
變數是在批處理或過程的主體中用 DECLARE 語句聲明的,並用 SET 或 SELECT 語句賦值。游標變數可使用此語句聲明,並可用於其他與游標相關的語句。除非在聲明中提供值,否則聲明之後所有變數將初始化為 NULL。
主題鏈接圖標 Transact-SQL 語法約定
語法
DECLARE
{
{{ @local_variable [AS] data_type } | [ = value ] }
| { @cursor_variable_name CURSOR }
} [,...n]
| { @table_variable_name [AS] <table_type_definition> | <user-defined table type> }
<table_type_definition> ::=
TABLE ( { <column_definition> | <table_constraint> } [ ,... ]
)
<column_definition> ::=
column_name { scalar_data_type | AS computed_column_expression }
[ COLLATE collation_name ]
[ [ DEFAULT constant_expression ] | IDENTITY [ ( seed ,increment ) ] ]
[ ROWGUIDCOL ]
[ <column_constraint> ]
<column_constraint> ::=
{ [ NULL | NOT NULL ]
| [ PRIMARY KEY | UNIQUE ]
| CHECK ( logical_expression )
}
<table_constraint> ::=
{ { PRIMARY KEY | UNIQUE } ( column_name [ ,... ] )
| CHECK ( search_condition )
}
參數
@ local_variable
變數的名稱。變數名必須以 at 符 (@) 開頭。局部變數名稱必須符合標識符規則。
data_type
任何系統提供的公共語言運行時 (CLR) 用戶定義表類型或別名數據類型。變數的數據類型不能是 text、ntext 或 image。
有關系統數據類型的詳細信息,請參閱數據類型 (Transact-SQL)。有關 CLR 用戶定義類型或別名數據類型的詳細信息,請參閱 CREATE TYPE (Transact-SQL)。
= value
以內聯方式為變數賦值。值可以是常量或表達式,但它必須與變數聲明類型匹配,或者可隱式轉換為該類型。
@ cursor_variable_name
游標變數的名稱。游標變數名稱必須以 at 符 (@) 開頭,並符合有關標識符的規則。
CURSOR
指定變數是局部游標變數。
@ table_variable_name
table 類型的變數的名稱。變數名稱必須以 at 符 (@) 開頭,並符合有關標識符的規則。
<table_type_definition>
定義 table 數據類型。表聲明包括列定義、名稱、數據類型和約束。允許的約束類型只包括 PRIMARY KEY、UNIQUE、NULL 和 CHECK。如果類型綁定了規則或默認定義,則不能將別名數據類型用作列標量數據類型。
<table_type_definition> 是在 CREATE TABLE 中用於定義表的信息子集。其中包含了元素和主要定義。有關詳細信息,請參閱 CREATE TABLE (Transact-SQL)。
n
指示可以指定多個變數並對變數賦值的佔位符。聲明 table 變數時,table 變數必須是 DECLARE 語句中聲明的唯一變數。
column_name
表中的列的名稱。
scalar_data_type
指定列是標量數據類型。
computed_column_expression
定義計算列值的表達式。計算列由同一表中的其他列通過表達式計算而得。例如,計算列可以定義為 cost AS price * qty。表達式可以是非計算列名稱、常量、內置函數、變數,也可以是用一個或多個運算符連接的上述元素的任意組合。表達式不能為子查詢或用戶定義函數。表達式不能引用 CLR 用戶定義類型。
[ COLLATE collation_name ]
指定列的排序規則。collation_name 可以是 Windows 排序規則名稱或 SQL 排序規則名稱,並且只適用於 char、varchar、text、nchar、nvarchar 和 ntext 數據類型的列。如果未指定,則該列的排序規則是用戶定義數據類型的排序規則(如果列為用戶定義數據類型)或當前資料庫的排序規則。
有關 Windows 排序規則名稱和 SQL 排序規則名稱的詳細信息,請參閱 COLLATE (Transact-SQL)。
DEFAULT
如果在插入過程中未顯式提供值,則指定為列提供的值。DEFAULT 定義可適用於除定義為 timestamp 或帶 IDENTITY 屬性的列以外的任何列。刪除表時,將刪除 DEFAULT 定義。只有常量值(如字元串)、系統函數(如 SYSTEM_USER())或 NULL 可用作默認參數。為了與 SQL Server 的早期版本兼容,可以為 DEFAULT 分配約束名稱。
constant_expression
用作列的默認值的常量、NULL 或系統函數。
IDENTITY
指示新列是標識列。在表中添加新行時,SQL Server 將為列提供一個唯一的增量值。標識列通常與 PRIMARY KEY 約束一起用作表的唯一行標識符。可以將 IDENTITY 屬性分配給 tinyint、smallint、int、decimal(p,0) 或 numeric(p,0) 列。每個表只能創建一個標識列。不能對標識列使用綁定默認值和 DEFAULT 約束。必須同時指定種子和增量,或者都不指定。如果二者都未指定,則取默認值 (1,1)。
seed
是裝入表的第一行所使用的值。
increment
添加到以前裝載的列標識值的增量值。
ROWGUIDCOL
指示新列是行的全局唯一標識符列。對於每個表,只能將其中的一個 uniqueidentifier 列指定為 ROWGUIDCOL 列。ROWGUIDCOL 屬性只能分配給 uniqueidentifier 列。
NULL | NOT NULL
決定在列中是否允許 Null 值的關鍵字。
PRIMARY KEY
通過唯一索引對給定的一列或多列強制實現實體完整性的約束。每個表只能創建一個 PRIMARY KEY 約束。
UNIQUE
通過唯一索引為給定的一列或多列提供實體完整性的約束。一個表可以有多個 UNIQUE 約束。
CHECK
一個約束,該約束通過限制可輸入一列或多列中的可能值來強制實現域完整性。
logical_expression
返回 TRUE 或 FALSE 的邏輯表達式。
<<user-defined table type>>
指定變數是用戶定義表類型。
備注
變數常用在批處理或過程中,作為 WHILE、LOOP 或 IF...ELSE 塊的計數器。
變數只能用在表達式中,不能代替對象名或關鍵字。若要構造動態 SQL 語句,請使用 EXECUTE。
局部變數的作用域是其被聲明時所在批處理。
當前分配有游標的游標變數可在下列語句中作為源引用:
* CLOSE 語句。
* DEALLOCATE 語句。
* FETCH 語句。
* OPEN 語句。
* 定位的 DELETE 或 UPDATE 語句。
* SET CURSOR 變數語句(在右側)。
在所有上述語句中,如果存在被引用的游標變數,但是不具有當前分配給它的游標,那麼 SQL Server 將引發錯誤。如果不存在被引用的游標變數,SQL Server 將引發與其他類型的未聲明變數引發的錯誤相同的錯誤。
游標變數:
* 可以是游標類型或其他游標變數的目標。有關詳細信息,請參閱 SET @local_variable (Transact-SQL)。
* 如果當前沒有給游標變數分配游標,則可在 EXECUTE 語句中作為輸出遊標參數的目標引用。
* 應被看作是指向游標的指針。有關游標變數的詳細信息,請參閱 Transact-SQL 游標。
示例
A. 使用 DECLARE
下例將使用名為 @find 的局部變數檢索所有姓氏以 Man 開頭的聯系人信息。
復制代碼
USE AdventureWorks;
GO
DECLARE @find varchar(30);
/* Also allowed:
DECLARE @find varchar(30) = 'Man%';
*/
SET @find = 'Man%';
SELECT LastName, FirstName, Phone
FROM Person.Contact
WHERE LastName LIKE @find;
下面是結果集:
復制代碼
LastName FirstName Phone
-------------------------------------------------- -------------------------------------------------- -------------------------
Manchepalli Ajay 1 (11) 500 555-0174
Manek Parul 1 (11) 500 555-0146
Manzanares Tomas 1 (11) 500 555-0178
(3 row(s) affected)
B. 在 DECLARE 中使用兩個變數
下例將檢索北美銷售區中年銷售額至少為 $2,000,000 的 Adventure Works Cycles 銷售代表的名字。
復制代碼
USE AdventureWorks;
GO
SET NOCOUNT ON;
GO
DECLARE @Group nvarchar(50), @Sales money;
SET @Group = N'North America';
SET @Sales = 2000000;
SET NOCOUNT OFF;
SELECT FirstName, LastName, SalesYTD
FROM Sales.vSalesPerson
WHERE TerritoryGroup = @Group and SalesYTD >= @Sales;
C. 聲明一個表類型的變數
下例將創建一個 table 變數,用於儲存 UPDATE 語句的 OUTPUT 子句中指定的值。在它後面的兩個 SELECT 語句返回 @MyTableVar 中的值以及 Employee 表中更新操作的結果。請注意,INSERTED.ModifiedDate 列中的結果與 Employee 表的 ModifiedDate 列中的值不同。這是因為對 Employee 表定義了 AFTER UPDATE 觸發器,該觸發器可以將 ModifiedDate 的值更新為當前日期。不過,從 OUTPUT 返回的列將反映觸發器激發之前的數據。有關詳細信息,請參閱 OUTPUT 子句 (Transact-SQL)。
復制代碼
USE AdventureWorks;
GO
DECLARE @MyTableVar table(
EmpID int NOT NULL,
OldVacationHours int,
NewVacationHours int,
ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25
OUTPUT INSERTED.EmployeeID,
DELETED.VacationHours,
INSERTED.VacationHours,
INSERTED.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO
D. 聲明一個用戶定義表類型的變數
下例將創建一個名為 @LocationTVP 的表值參數或表變數。這需要使用一個相應的名為 LocationTableType 的用戶定義表類型。有關如何創建用戶定義表類型的詳細信息,請參閱 CREATE TYPE (Transact-SQL)。有關表值參數的詳細信息,請參閱表值參數(資料庫引擎)。
復制代碼
DECLARE @LocationTVP
AS LocationTableType;
B. 如果一個表不存在則創建一個表的SQL語句怎麼寫
<%
Dim SQL,Conn
Set Conn= Server.CreateObject("ADODB.Connection")
Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("111.mdb")
Conn.Open
'上面是建立資料庫連接,並打開
'*********************************************************************************************************
SQL="CREATE TABLE 222("&_ '創建表222
"333 varchar(20),"&_ '建立字元型欄位333,大小為20
"444 int Default 0"&_ '建立數值型欄位444,默認值為0
") "
Conn.ExeCute(SQL) '執行Sql語句
%>
不要忘了把資料庫的安全改為完全控制
C. sql語句 table作為表變數如何賦值給日期變數
declare @sql nvarchar(max)
set @sql='select @d=date from '+ @table
exec sp_executesql @sql,N'@d datetime output',@date output
print @date
--ps:如果@table輸出多的話@date只能保留最後一個值,要想保留表集的話,還是用臨時表或者表變數吧
D. mssql 如何把一個表中的 所有欄位都賦值一個相同的值
--假設分別是A表和B表,sql 如下:declaretableA_count number;tableB_count number;C_tableA CURSOR;begin select count(1) into tableA_count from A ; select count(1) into tableB_count from B ; C_tableA is selct * from A; if tableA_count=tableB_count then for C_cursor in C_tableA loop select * from A where exists (selcet 1 from B where A.column1=B.column1 and A.column2=B.column2...) and A.column1=C_cursor.column1 and ..; if SQL%NOTFOUND dbms_output.put_line("2個表的數據不是一樣的"); return; else; END LOOP; dbms_output.put_line("2個表的數據是一樣的"); else dbms_output.put_line("2個表的數據是一樣的"); end;
E. 表名為變數的sql插入語句
使用exec(sql語句)
例:使用變數拼接SQL語句,然後用exec運行
declare @table varchar(200)
declare @sql varchar(200)
set @table = 'aaa'
set @sql='select * from '+@table
exec(@sql)
例中的變數@table 即傳遞表名
sql='select * from '+@table 即 select * from aaa