我有以下2个应该返回相同信息的查询。
一个普通的查询和动态查询,由于@TABLENAME变量命名,我没有检索到任何结果。
DECLARE @TABLENAME as NVARCHAR (MAX)
SET @TABLENAME = 'MyTable'
查询返回结果
select * from jfa.[dbo].[MyTable]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = @TableName and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = 2
不返回任何结果的动态查询
DECLARE @sql as nvarchar(max)
set @sql = 'select * from jfa.[dbo].[MyTable]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = ''@TableName'' and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = 2'
exec sp_executeSQL @sql,
N'@TABLENAME nvarchar',
@TABLENAME
我猜问题出在以下几行:
on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = ''@TableName''
但是我尝试了几件事并没有成功。
非常感谢,
吉
答案 0 :(得分:1)
请改为尝试:
...
set @sql = 'select * from jfa.[dbo].[MyTable]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = ' + @TableName + ' and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = 2'
...
您需要将参数值直接连接到动态sql查询,因此请使用...' + @TableName + ' ...
答案 1 :(得分:1)
问题出在这里:
N'@TABLENAME nvarchar',
此代码表示变量@TABLENAME
为nvarchar(1)
。将其更改为例如。
N'@TABLENAME nvarchar(45)',
此外,您必须从'
删除双INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = ''@TableName''
。
所以你的代码看起来像:
DECLARE @sql as nvarchar(max)
set @sql = 'select * from jfa.[dbo].[MyTable]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = @TableName --change here
and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = 2'
exec sp_executeSQL @sql,
N'@TABLENAME nvarchar(45)', --change here
@TABLENAME
但是,如果要动态更改要从中选择数据的表,则必须将静态jfa.[dbo].[MyTable]
更改为jfa.[dbo].'+@TableName+'
。最后,您的查询将如下所示:
DECLARE @sql as nvarchar(max)
set @sql = 'select * from jfa.[dbo].'+@TableName+' --change here
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = @TableName --change here
and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = 2'
exec sp_executeSQL @sql,
N'@TABLENAME nvarchar(45)', --change here
@TABLENAME