【问题标题】:How to use locally declared variables in SQL SELECT INSERT INTO?如何在 SQL SELECT INSERT INTO 中使用本地声明的变量?
【发布时间】:2016-02-26 06:51:48
【问题描述】:

我正在从事一个项目,该项目涉及从一个表中检索数据,并解析某些字段中的一些信息并将它们放入另一个表的其他字段中。这涉及到一些 LEFT、SUBSTRING 和 RIGHT 函数。

我的问题是,当我运行查询时,变量会返回源表的最后一个值,并将其作为目标表字段中每一行的值。但是,其他字段为每一行返回不同的值,这是我们所期望的。

SQL 版本是 MSSQL Server 2012

这是代码(为简洁明了,表和字段名已更改)

USE [databaseName]
DECLARE @Year varchar(5);
DECLARE @Type varchar(2);
DECLARE @CaseType varchar(20);
DECLARE @ParsedHeader varchar(20);

SELECT @Year=SUBSTRING([tableSource].[Header],2,5)
FROM [tableSource];

SELECT @Type=LEFT([tableSource].[Header],2)
FROM [tableSource];

SELECT @CaseType=CASE(WHEN @Type='AA' THEN 'Type AA'
                      WHEN @Type='BB' THEN 'Type BB'
                      WHEN @Type='CC' THEN 'Type CC'
                      )
                      END;

SELECT @ParsedHeader =LEFT([tableSource].[OtherHeader],2)
                      +' '
                      +SUBSTRING([tableSource].[OtherHeader],3,7)
                      +'-'
                      RIGHT([tableSource].[OtherHeader],3)
FROM [tableSource];

INSERT INTO [tableTarget](
Name,
Foo,
Bar,
Year,
Type,
CaseType,
ParsedHeader)

SELECT(
Name,
Foo,
Bar,
@Year,
@Type,
@CaseType,
@ParsedHeader
)
FROM [tableSource];

运行时,我得到一组结果,其中 Year、Type、CaseType 和 ParsedHeader(可以为 NULL,最后一条记录为 NULL)字段总是从 sourceTable 中的最后一条记录中提取。 我显然在这里的逻辑中遗漏了一些东西。任何帮助表示赞赏。

【问题讨论】:

    标签: sql sql-server-2012 sql-insert insert-into


    【解决方案1】:

    您必须将所有内容放在INSERT 操作中使用的查询的SELECT 子句中:

    INSERT INTO [tableTarget](Name, Foo, Bar, Year, Type, CaseType, ParsedHeader)
    SELECT Name, Foo, Bar,
           SUBSTRING([tableSource].[Header],2,5), -- @Year
           LEFT([tableSource].[Header],2),        -- @Type
           CASE 
             WHEN @Type='AA' THEN 'Type AA'
             WHEN @Type='BB' THEN 'Type BB'
             WHEN @Type='CC' THEN 'Type CC'             
           END,  -- @CaseType
           LEFT([tableSource].[OtherHeader],2)
           +' '
           + SUBSTRING([tableSource].[OtherHeader],3,7)
           +'-'
           + RIGHT([tableSource].[OtherHeader], 3) --   @ParsedHeader
    FROM [tableSource];
    

    【讨论】:

    • 谢谢您,先生。这最终正是我所需要的。那么我可以问一下,为什么我的方法不起作用,只是为了让我能理解为什么而不是如何(希望也能帮助其他人避免这种情况。)
    猜你喜欢
    • 2020-06-30
    • 2023-03-06
    • 2012-10-05
    • 2012-01-23
    • 2022-12-11
    • 2011-02-26
    • 2023-02-09
    • 2021-07-22
    • 2017-11-09
    相关资源
    最近更新 更多