sql - 使用动态 SQL 时列名无效

标签 sql sql-server tsql database-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

最佳答案

如果您希望动态 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

关于sql - 使用动态 SQL 时列名无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36739554/

相关文章:

mysql - SQL 查询查找表中包含所有元音的所有值。

sql - DB中的存储函数和 View 有什么区别?

mysql - 按不存在的列排序?

sql-server - 如何使用 tsql 更新具有增量值的列?

sql - 当 IN 子句有子查询时,为什么 SQL Server 执行群集扫描?

xml - 对于 XML 路径和 xsi :nil attributes

mysql - 根据特定字段名称获取所有 MySQL 表中 NULL 记录的计数

mysql - 在 SQL 的 where 子句中使用别名

sql-server - sql server 中 UNION 的替代

sql - 基于其他字段更改 SQL CONSTRAINT