动态查询:如何在SQL-Server中定义表名或其他字符串

时间:2017-10-18 10:03:49

标签: sql sql-server dynamic

我有以下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''

但是我尝试了几件事并没有成功。

非常感谢,

2 个答案:

答案 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',

此代码表示变量@TABLENAMEnvarchar(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