如何在SQL SELECT INSERT INTO中使用本地声明的变量?

时间:2016-02-26 06:51:49

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

我正在开发一个项目,该项目涉及从一个表中检索数据,并从某些字段中解析出一些信息并将它们放到另一个表的其他字段中。这涉及一些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中的最后一条记录中提取。 我在这里的逻辑中显然遗漏了一些东西。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

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

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];