SQL Server:将动态SQL查询分配给变量并执行

时间:2016-12-08 03:34:44

标签: sql sql-server dynamic

我有一个场景,我必须根据表名执行动态SQL查询。

例如我有一张表X

|**table name**|  **Query**                                               |
|--------------|------------------------------------------------------------|
| A            |select ' +@somevariable1+ ' from '+@servername+ @table_name |

所以我的查询看起来像是

Set @sql = (select query from X where table name =@table_name)   
Exec @sql

此处exec @sql无效。关于如何执行此动态SQL查询的任何想法?

2 个答案:

答案 0 :(得分:0)

您需要指定架构

https://msdn.microsoft.com/en-us/library/ms174979.aspx

CREATE TABLE   
    [ database_name . [ schema_name ] . | schema_name . ] table_name   
    ( { <column_definition> } [ ,...n ] )   
[ ; ]  

所以你的查询应该是:

'select ' + @somevariable1 + ' from ' + @servername + '.[dbo].' + @table_name 

答案 1 :(得分:0)

你想要这样吗,实际上你需要执行两次动态脚本。 第一次获得真正的SQL脚本,然后执行之前生成的脚本,例如:

DECLARE @servername NVARCHAR(100)='master.dbo.',@table_name Nvarchar(100)='spt_values',@somevariable1 NVARCHAR(100)='number'
DECLARE @sql NVARCHAR(max),@query NVARCHAR(max)
;WITH X(TableName,Query)AS(
        SELECT 'A',  '''SELECT top 5 '' +@somevariable1+ '' from ''+@servername+ @table_name+'' WHERE type=''''p''''''' 
)
SELECT @query=X.Query FROM X WHERE X.TableName='A'

SET @query=N'set @sql=(select '+@query+N')'
exec sp_executesql @query,N'@sql nvarchar(max) out,@servername NVARCHAR(100),@table_name varchar(100),@somevariable1 NVARCHAR(100)'
,@sql out,@servername ,@table_name,@somevariable1
PRINT @sql    
EXEC( @sql)
--Excute command result at first time:
SELECT top 5 number from master.dbo.spt_values WHERE type='p'
--- Execute below script:

number
-----------
0
1
2
3
4