2016-04-20 23 views
5

初めて動的SQLを使用しようとしていますが、動的SQLを使用して一時テーブルにパラメータを入力しようとしているにもかかわらず、列名であることを意図していないテキストとしてこれを入力しようとしています。側では 動的SQLを使用するカラム名が無効

は、私はSQL Server 2005の

事前にこの私の実行クエリです

SELECT ARCHV_FLAG,PATNT_REFNO,ACTIVE_NAMES,AINPT_REFNO INTO #TEMP FROM ACTIVE_NAMES WHERE PATNT_REFNO = 1 AND ARCHV_FLAG = 'C' 

Fix SET @SQL = 'SELECT ARCHV_FLAG,PATNT_REFNO,'''[email protected] +''' AS  [ACTIVE_NAMES],'+ @PK + ' INTO #TEMP FROM ' + @TABLE + ' WHERE PATNT_REFNO = '+ CAST(@PATNT AS VARCHAR (100))+ ' AND ARCHV_FLAG = ''C''' 

多くのおかげでこれを実行しています言及するその価値を注意してください。

DECLARE 
    @SQL NVARCHAR(4000), 
    @SQL1 NVARCHAR(4000), 
    @TABLE VARCHAR (100), 
    @PK VARCHAR (50), 
    @PATNT INT 

SET @PATNT = 1 

CREATE TABLE #TEMP 
(
    ARCHV_FLAG VARCHAR (1), 
    PATNT_REFNO INT, 
    TABLE_NAME VARCHAR (100), 
    PRIMARY_KEY INT 
) 

CREATE TABLE #TABLE 
(NAME VARCHAR (100)) 

INSERT INTO #TABLE (NAME) VALUES ('ACTIVE_NAMES') 

SELECT * FROM #TABLE 

DECLARE Cur CURSOR FOR 
SELECT NAME FROM #TABLE 

OPEN Cur 

FETCH NEXT FROM Cur INTO @TABLE 
WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @PK = (SELECT C.NAME FROM SYS.COLUMNS C 
     JOIN SYS.tables T ON C.object_id = T.object_id 
     WHERE T.name = @TABLE AND C.is_identity = 1) 

SET @SQL = 'SELECT ARCHV_FLAG,PATNT_REFNO,'[email protected] +','+ @PK + ' INTO #TEMP FROM ' + @TABLE + ' WHERE PATNT_REFNO = '+ CAST(@PATNT AS VARCHAR (100))+ ' AND ARCHV_FLAG = ''C''' 
EXEC SP_EXECUTESQL @SQL 

select @sql 

FETCH NEXT FROM Cur INTO @TABLE 
END 
CLOSE Cur 
DEALLOCATE Cur 

SELECT * FROM #TEMP 
DROP TABLE #TEMP 
DROP TABLE #TABLE 
+0

uが使用しているバージョン?それは私の最後に完璧に動作します。 – BNN

+0

ちょうどそれを追加することを忘れないでください - 残念なことにSQL Server 2005を実行しています – user3482471

+0

URの質問を更新することができます、そのどこに追加するのか混乱します。 – BNN

答えて

5

あなたは、列名を文字列リテラルとして、あなたの変数を治療するために、動的SQLを希望していない場合は、単一引用符でラップする必要があります:

SET @SQL = 'SELECT ARCHV_FLAG,PATNT_REFNO,'''[email protected] +''' AS [ACTIVE_NAMES],'+ @PK + ' INTO #TEMP FROM ' + @TABLE + ' WHERE PATNT_REFNO = '+ CAST(@PATNT AS VARCHAR (100))+ ' AND ARCHV_FLAG = ''C''' 
EXEC SP_EXECUTESQL @SQL 
+0

こんにちはジョージ、私は私たちが一歩近づくかもしれないと思うコメントをありがとう。しかし、私は今このメッセージを取得しています。メッセージ1038、レベル15、状態5、行1 オブジェクトまたは列名が存在しないか、空です。 SELECT INTOステートメントの場合、各列に名前があることを確認します。他のステートメントの場合は、空のエイリアス名を探します。 ""または[]と定義された別名は使用できません。エイリアス名として名前または単一のスペースを追加します。 – user3482471

+0

上記のコードスニペットを修正して、その列のエイリアスを指定してください。 –

+0

こんにちはジョージ、私はそれを使用すると、私はそれがあまりにも多くのインチを持っていると思うそれの中に私のスクリプトの残りの部分を(すなわち、赤で) – user3482471

関連する問題