SQL SERVER存儲過程動態SQL的實現
中文
這個問題在最近寫存儲過程時困擾了N久,用BAIDU查遍國內的各網站使用沒有一個好的解決方案,最終通過GOOGLE搜索關鍵字"SQL SERVER DYNAMIC SQ"L,再通過各國外論壇才找到一個不起眼的網站的某頁面.
http://www.sommarskog.se/dynamic_sql.html
文章的標題是<The Curse and Blessings of Dynamic SQL>,由此可見此問題讓人恨,而一旦解決就能讓人愛哩......
正如文章中所稱,該文是為了解決諸如此類的問題:
SELECT * FROM @tablename
SELECT @colname FROM tbl
SELECT * FROM tbl WHERE x IN (@list)
而我最頭疼的就是第一條,試圖通過 select @name=name from @tablename來獲取某動態表的變量.但文章中明確指出,同時也是我試了N次得到的結論
動態SQL只能通過如
@SQL='select @name=name from '+@tablename
要運行這條,大多數人都是通過EXEC(@SQL),但是,@name類似程序中局部變量,生存期只有在EXEC中.無法在SQL存儲過程中使用.
在文章中終于找到解決辦法......
范例程序
DECLARE @sql nvarchar(4000), -- nvarchar(MAX) on SQL 2005.
@col sysname,
@min varchar(20)
SELECT @col = N'au_fname'
SELECT @sql = N'SELECT @min = convert(varchar(20), MIN(' + @col +
N')) FROM authors'
EXEC sp_executesql @sql, N'@min varchar(20) OUTPUT', @min OUTPUT
SELECT @min
終于可以解決哩.......但要注意的是,sp_executesql后的參數只能是NVARCHAR,VARCHAR之類的字符型.
終于解決了.......
該文中還有一些防止SQL注入之類的討論,以及對新手講解SQL存儲過程的意義何在.
做SQL數據庫,并轉向存儲開發過程的人必看.....
技術,還是老外牛X......而且老外更傾向技術的交流,而國內號稱有許多高手,真正樂意分享的太少太少......