2017-10-18 43 views
1

我有以下2個應該返回相同信息的查詢。動態查詢:如何在SQL-Server中定義表名或其他字符串

一個正常的查詢和動態查詢,由於@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

的可能的複製[?如何寫在存儲過程中動態表名選擇查詢](https://stackoverflow.com/questions/40233532/how-to-write -select-query-with-dynamic-table-name-in-stored-procedure) –

回答

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].'[email protected]+'。最後,你的查詢將是這樣的:

DECLARE @sql as nvarchar(max) 
set @sql = 'select * from jfa.[dbo].'[email protected]+' --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 
+0

謝謝Rokuto,我改編了它,我也爲其他Varchar(45)定義過。當插入表中時,它只是添加第一個字符。 – Katherine99

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 + ' ...

相關問題