如何在 SQL SELECT INSERT INTO 中使用局部声明的变量?
How to use locally declared variables in SQL SELECT INSERT INTO?
我正在从事一个项目,该项目涉及从一个 table 检索数据,并从某些字段中解析出一些信息并将它们放入另一个 table 的其他字段中。这涉及到一些LEFT、SUBSTRING和RIGHT函数。
我的问题是当我 运行 我的查询时,变量 return 源的最后一个值 table 并将其作为每一行的值放在目标 table。但是,其他字段 return 每行的值不同,这正是我们所希望的。
SQL 版本是 MSSQL Server 2012
这是代码(table 为简洁明了起见更改了字段名称)
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)字段总是从源表。
我在这里的逻辑中显然遗漏了一些东西。感谢任何帮助。
您必须将所有内容放在 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];
我正在从事一个项目,该项目涉及从一个 table 检索数据,并从某些字段中解析出一些信息并将它们放入另一个 table 的其他字段中。这涉及到一些LEFT、SUBSTRING和RIGHT函数。
我的问题是当我 运行 我的查询时,变量 return 源的最后一个值 table 并将其作为每一行的值放在目标 table。但是,其他字段 return 每行的值不同,这正是我们所希望的。
SQL 版本是 MSSQL Server 2012
这是代码(table 为简洁明了起见更改了字段名称)
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)字段总是从源表。 我在这里的逻辑中显然遗漏了一些东西。感谢任何帮助。
您必须将所有内容放在 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];