如何从变量运行生成的SQL?

RL4*_*L4P 5 t-sql sql-server-2008

我已经尝试运行我的SQL(在T-SQL中)(我只是生成了一个变量)但我无法运行它.我想要做的是:1.从程序2运行大SQL.大SQL生成selct-SQL 3.运行生成的sql像正常选择和接收数据一样正常.我认为可以用sp_executesql完成,但看起来它在我的情况下是不对的.

我正在尝试的是这样的:

declare @sql varchar(max)

set @sql = 'select x, y from z'

exec @sql --this is the point where im stuck.
Run Code Online (Sandbox Code Playgroud)

我知道这一定是一个非常基本的问题,但是在谷歌上找不到适合我问题的东西.

谢谢你的帮助!

更新 我通过使用sp_sqlexec解决了我的问题(不再支持,但工作就像我想要的那样).

declare @sql varchar(max)

set @sql = 'select x, y from z'

exec sp_sqlexec @sql 
Run Code Online (Sandbox Code Playgroud)

正确的解决方案是sp_executesql!(请参阅sp_sqlexec与sp_executesql)对于我的问题,如果我"重建"我可以使用它的所有东西,那将是非常耗时的.

谢谢你的帮助!

Mar*_*ith 8

你需要括号 exec (@sql)

SQL Server将在@sql变量中查找名称的存储过程而不进行此操作并进行抱怨Could not find stored procedure 'select x, y from z'.

如果您正在使用动态SQL请参阅动态SQL 的诅咒和祝福,以获取有关该主题的精彩文章.


Stu*_*tLC 5

您也可以使用sp_executesql,但请注意它需要NVARCHAR(Unicode)

此外,如果要构建动态过滤器,则可以按以下方式传入参数

declare @SQL nvarchar(max)
set @SQL = N'select x, y from z where x = @someFilter'
exec sp_executesql @SQL, N'@someFilter bigint', @someFilter = 6034280
Run Code Online (Sandbox Code Playgroud)