2016-08-22 49 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