2016-08-22 35 views
1

我正在寫一個查詢以將值從excel插入到sql server。我有一個帶有Identity(1,1)字段的表,我希望它鏈接到另一個表。在插入時使用Scope_Identity鏈接表...值

例子:

ID  Vegetables 
1  Corn/Peas 
2  Beans/Spinach 

要鏈接,看起來像一個表:

ID  Vegetable 
1  Corn 
1  Peas 
2  Beans 
3  Spinach 

我有一個編碼分割字符串函數,將一個字符串分隔符,將其分解,返回表。

我想用這個在INSERT語句,我有一個變量

@scopeID = SCOPE_Identity() 

我想我需要使用交叉適用,但不知道,因爲我基本上是添加到兩個表。

我有類似:

Insert Into [VegetableTable](
[Vegetable]) 

Values(
@Vegetable --pulling from Excel VBA 
) 

Declare @scopeID Int 
Set @scopeID = SCOPE_IDENTITY() 

任何幫助編寫得到表2將是很有益的方式。

感謝

編輯: 我有一個分裂的字符串,返回類似:

ID   Vegetable    Want (ScopeID) 
1   Corn      1 
2   Peas      1 
3   Broccoli     1 
1   Beans      2 
2   Spinach      2 

如果我加入花椰菜的第一個列表。但我需要匹配這些,所以我的範圍標識與蔬菜配對,在這種情況下是兩個獨立的字符串。

+0

查找標準拆分函數(有一大堆可用)。你的分隔符是'/'。這裏有一堆鏈接:http://sqlperformance.com/2012/07/t-sql-queries/split-strings – ZLK

+0

請參閱編輯。它可能會突出顯示我需要更好的幫助 – user3697498

回答

0

如果您有固定數目的分隔符,則可以使用此查詢。

;with cte as (
select *, substring(vegetables, 0,charindex('/', vegetables)) firsthalf, substring(vegetables, charindex('/', vegetables)+1, len(vegetables)) secondhalf from veg 
) select id, firsthalf from cte union all 
select id,secondhalf from cte 
0

如果我理解正確的問題,那麼我會簡單地創建一個初始的excel導入表,並在表中定義一個觸發器。導入表將生成您的ID,並且導入表上的觸發器可以將數據轉換爲您想要的格式。下表導入表的一個例子:

CREATE TABLE [dbo].[VegetableTableExcel](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Vegetables] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_VegetableTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

接下來的結果表:

CREATE TABLE [dbo].[Vegetables](
    [ID] [int] NOT NULL, 
    [VegetableName] [nvarchar](50) NOT NULL 
) ON [PRIMARY] 

最後,在原裝進口的觸發器,從Excel將你的源代碼的導入:

CREATE TRIGGER SplitVegetable ON VegetableTableExcel 
AFTER INSERT 
AS 


    MERGE INTO Vegetables AS [Target] 
    USING (

       SELECT [Source].ID 
         ,Vegetables.VegetableName 
       FROM inserted [Source] 
       CROSS APPLY (
           SELECT splitdata AS VegetableName 
           FROM dbo.SplitString([Source].Vegetables, '/') 
          ) Vegetables   
      ) AS [Source] 
    ON ([Target].[ID] = [Source].[ID]) AND ([Target].[VegetableName] = [Source].[VegetableName]) 
    WHEN NOT MATCHED BY TARGET THEN 
    INSERT (
       [ID] 
       ,[VegetableName] 
      ) VALUES 
      (
       [Source].[ID] 
       ,[Source].[VegetableName] 
      ) ; 

爲了完整,我已經包含了splitter函數,用於分割包含以下蔬菜名稱的字符串:

CREATE FUNCTION [dbo].[SplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END