使用动态SQL的列名无效

时间:2016-04-20 09:32:31

标签: sql sql-server tsql dynamic cursor

我正在尝试第一次使用动态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,'''+@TABLE +''' 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,'+@TABLE +','+ @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

1 个答案:

答案 0 :(得分:6)

如果您希望动态SQL将您的变量视为文字字符串而不是列名,则必须将其包装在单引号中:

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