我有一个场景,我必须根据表名执行动态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查询的任何想法?
答案 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