变量
用DECLARE声明一个或多个变量,用SET语句可以把一个变量设置成指定的值。
DECLARE @A AS VARCHAR(50);
SET @A = 1
SQL Server2008新增了对同一语句声明和赋值变量。
DECLARE @B AS INT = 10;
SET语句每次只能对一个变量进行操作,所以如果要对多个变量赋值,就必须使用多次SET语句。当从同一行取出不同的列的值时,可能会带来不必要的开销。
SET @A = (SELECT Name FROM T_Order WHERE OrderID = 1)
SET @B = (SELECT OrderID FROM T_Order WHERE OrderID = 1)
SQL Server还支持一种非标准的赋值SELECT语句,允许在单独的语句中既能查询数据,又能把同一行的多个值赋值给多个变量。
SELECT @A = Name,@B = OrderID
FROM T_Order
WHERE OrderID = 1
标量子查询:返回结果只有一行的子查询。
批处理
批处理是客户端应用程序发送一条或多条T-SQL语句到SQL Server,SQL Server将批处理语句作为单个可执行的单元。批处理要处理的阶段有:分析,解析,优化。
SQL Server Management Studio提供了一个客户端命令GO,可以发出一批T-SQL语句结束的信号。注意,GO是客户端的工具,而不是T-SQL的服务器命令。
批处理是作为一个单元而进行分析和执行的一组命令。如果分析成功,SQL Server接着会尝试执行批处理。如果批处理中出现语法错误,整个批处理就不会提交到SQL Server执行。
变量是属于定义它们的批处理的局部变量,如果试图引用在其他批处理中定义的变量,SQL Server引擎会提示引用的变量还未定义。
DECLARE @A AS INT = 10;
PRINT @A;
GO
PRINT @A;
GO
不能在同一批处理和其他语句同时编译的语句:CREATE DEFAULT,CREATE FUNCTION,CREATE PROCEDURE,CREATE RULE,CREATE SCHEME,CREATE TRIGGER及CREATE VIEW。
IF OBJECT_ID('V_Shop','C') IS NOT NULL DROP TABLE V_Shop
GO
CREATE VIEW V_Shop AS
SELECT * FROM T_Shop
GO
如果在同一个批处理中既对数据对象进行了修改,又查询了对象,那么SQL Server可能还不知道架构发生了什么变化,因而无法执行数据处理语句,报告解析错误。这种问题的解决方式是把DDL语句和DML语句分隔到不同的批处理中。
SQL Server2005对Go这个客户端工具,进行了增强,让它可以支持一个正整数参数,表示Go之前的批处理将执行的次数。
CREATE TABLE #T(ID INT IDENTITY)
SET NOCOUNT ON; --防止DML输出影响行数
INSERT INTO #T DEFAULT VALUES
GO 100
SELECT * FROM #T