如何使用动态sql将结果存储在临时表中

问题描述 投票:0回答:1

我想将此 sql server 请求的结果存储在临时表 #TAB1 中,但是当我向 #TAB1 添加插入时,我的程序崩溃并出现以下错误

关键字“INSERT”附近的语法不正确。

代码:

CREATE TABLE #TAB1 (
    NAT_SIN VARCHAR(50),
    STE_ASSUR VARCHAR(50),
    EXER_SIN INT,
    NUM_SIN INT,
    CLE_SIN INT,
    SAV_TG VARCHAR(50),
    RCP_TG VARCHAR(50),
    TYPE VARCHAR(50),
    VALUE VARCHAR(50)
)

DECLARE @Columns TABLE (
    ColumnName VARCHAR(50),
    ColumnType VARCHAR(50)
)

INSERT INTO @Columns VALUES
    ('SAV_RA', 'SAV_RA'),
    ('RCP_RA', 'RCP_RA'),
    ('SAV_AB', 'SAV_AB'),
    ('RCP_AB', 'RCP_AB'),
    ('SAV_PP', 'SAV_PP'),
    ('RCP_PP', 'RCP_PP'),
    ('SAV_C1', 'SAV_C1'),
    ('RCP_C1', 'RCP_C1'),
    ('SAV_C0', 'SAV_C0'),
    ('RCP_C0', 'RCP_C0'),
    ('SAV_F0', 'SAV_F0'),
    ('RCP_F0', 'RCP_F0'),
    ('SAV_F1', 'SAV_F1'),
    ('RCP_F1', 'RCP_F1'),
    ('SAV_F2', 'SAV_F2'),
    ('RCP_F2', 'RCP_F2')

DECLARE @SQL NVARCHAR(MAX) = ''

SELECT @SQL = @SQL + '
INSERT INTO #TAB1 SELECT
    NAT_SIN,
    STE_ASSUR,
    EXER_SIN,
    NUM_SIN,
    CLE_SIN,
    SAV_TG,
    RCP_TG,
    ''' + ColumnType + ''' AS TYPE,
    ' + ColumnName + ' AS VALUE
 FROM
    #Test
UNION ALL
'
FROM @Columns

SET @SQL = LEFT(@SQL, LEN(@SQL) - 11)

EXEC(@SQL)

select * from #TAB1
sql sql-server t-sql
1个回答
0
投票

当您构建动态 SQL 并将列名 (ColumnName) 连接到 SELECT 语句中时,确保它们正确封装至关重要。由于它们表示字符串值,因此必须将它们括在单引号内。

具体操作方法如下:

选择@SQL = @SQL + ' 插入 #TAB1 选择 NAT_SIN, STE_ASSUR, EXER_SIN, NUM_SIN, CLE_SIN, SAV_TG, RCP_TG, ''' + 列类型 + ''' 作为类型, ''' + 列名 + ''' 作为值 从 #测试 联合所有 ' 来自@Columns

在此代码片段中,我确保在

ColumnName
(
''' + ColumnName + '''
) 周围添加单引号,以确保它在动态 SQL 语句中被视为字符串文字。这可确保正确处理查询中的列名称。

© www.soinside.com 2019 - 2024. All rights reserved.