2017-10-18 3 views
1

同じ情報を返す次の2つのクエリがあります。動的クエリ:SQL Serverでテーブル名やその他の文字列を定義する方法

@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'' and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = 2' 

    exec sp_executeSQL @sql, 
    N'@TABLENAME nvarchar', 
    @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 

動的問合せは、私は問題は次の行にある推測:

on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = ''@TableName'' 

しかし、私はいくつかのことを試みた成功していない。事前に

多くのおかげで、

キャット

+0

の可能な複製を(https://stackoverflow.com/questions/40233532/how-to-write -select-query-with-stored-procedure-with-stored-procedure) –

答えて

1

問題はここにあります:

N'@TABLENAME nvarchar', 

このコードは、変数@TABLENAMEnvarchar(1)であることを示します。たとえばに変更します。あなたはINFORMATION_SCHEMA.COLUMNS.TABLE_NAME = ''@TableName''からダブル'を削除する必要があります。また

N'@TABLENAME nvarchar(45)', 

。あなたがデータを選択しているから動的にテーブルを変更したい場合は

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

徳島大学にありがとう、私はそれを適用しました。私は他の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 + ' ...

関連する問題