2016-02-26 67 views
0

我正在從事一個涉及從一個表中檢索數據並解析出某些字段中的某些信息並將它們放入另一個表中的其他字段的項目。這涉及一些LEFT,SUBSTRING和RIGHT功能。如何在SQL SELECT INSERT INTO中使用本地聲明的變量?

我的問題是當我運行我的查詢時,變量返回源表的最後一個值,並將其作爲目標表中字段中每一行的值。但是,其他字段爲每行返回不同的值,這是所期望的。

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

在運行時,我得到一個結果集,其中年度,Type,CaseType和ParsedHeader(可以爲NULL,最後一個記錄爲NULL)字段始終從sourceTable中的最後一個記錄中提取。 我很明顯在我的邏輯中錯過了一些東西。任何幫助表示讚賞。

回答

2

你必須把一切都在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]; 
+0

謝謝你,先生。這最終正是我所需要的。那麼我可以問,爲什麼我的方式行不通,只能理解爲什麼,而不僅僅是如何(希望能幫助別人避免這種情況)。 –