我正在尝试第一次使用动态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
答案 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