SQLServer中動態查詢sql返回值給變數<整理>

taogchan發表於2012-09-10

sp_executesql 或 EXECUTE 語句執行字串時,字串被作為其自包含批處理執行。SQL Server 將Transact-SQL 語句或字串中的語句編譯進一個執行計劃,該執行計劃獨立於包含 sp_executesql 或 EXECUTE 語句的批處理的執行計劃。下列規則適用於自含的批處理:

直到執行 sp_executesql 或EXECUTE 語句時才將sp_executesql 或 EXECUTE 字串中的 Transact-SQL 語句編譯進執行計劃。執行字串時才開始分析或檢查其錯誤。執行時才對字串中引用的名稱進行解析。
執行的字串中的 Transact-SQL 語句,不能訪問 sp_executesql 或 EXECUTE 語句所在批處理中宣告的任何變數。包含 sp_executesql 或 EXECUTE 語句的批處理不能訪問執行的字串中定義的變數或區域性遊標。
如果執行字串有更改資料庫上下文的 USE 語句,則對資料庫上下文的更改僅持續到 sp_executesql 或 EXECUTE 語句完成。
 

sp_executesql 支援對 Transact-SQL 字串中指定的任何引數的引數值進行替換,但是 EXECUTE 語句不支援。因此,由 sp_executesql 生成的 Transact-SQL 字串比由 EXECUTE 語句所生成的更相似。SQL Server 查詢最佳化器可能將來自 sp_executesql 的 Transact-SQL 語句與以前所執行的語句的執行計劃相匹配,以節約編譯新的執行計劃的開銷。

1) DECLARE @tbname sysname,@sql varchar(100)
SET @sql='SELECT FROM sysobjects where id=1'
EXEC(@sql)
SELECT @tbname


2) Declare
@tb varchar(10),
@count varchar(10),
@s Nvarchar(4000)
set @tb='1'
set @s=N'select @a=count(0) from ChargeLog_'+rtrim(@tb)
exec sp_executesql @s,N'@a int output',@count output
print @count

返回多個引數:

declare
@str nvarchar(1000),
@m int ,
@VAR VARCHAR(10)

set @str=N'select @MAX=max(grade),@VAR=@NAME from s where name like @name'
exec sp_executesql @str,N'@name varchar(10),@max int output,@VAR VARCHAR(10) OUTPUT',@name='bbaa',@max=@M OUTPUT,@VAR=@var OUTPUT

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22392018/viewspace-743069/,如需轉載,請註明出處,否則將追究法律責任。

相關文章