SSIS:如何处理要在SQL Server表中插入的多选查找列值

时间:2014-09-05 07:24:04

标签: sharepoint-2013 ssis

我需要提取Sharepoint列表数据并将它们导入SQL Server Tables。

我可以使用SSIS数据流(包括派生列和数据转换控件)来完成此操作。 我还能够将单行,多行,日期,查找(单选)数据类型转换为SQL数据类型。

但是现在,我的问题是针对具有多重选择的查找列:

  1. 派生列中使用的表达式应该是什么,用于将数据转换为逗号分隔值?

    下面的表达式我用来从单一选择的查阅列中获取ID。

    SUBSTRING(业务,1,FINDSTRING(业务,“;#”,1) - 1)

  2. enter image description here

    如果您看到上面的屏幕截图,则从公共列表输出中,它显示未来风险缓解控制以分号分隔,并在一行中包含多个值。

    在Derived列输出中,它仅获取第一个ID并放在Risk Controls列中。

    现在问题是:

    • 我们应该以逗号分隔这些ID并将其作为varchar存储在SQL表中吗?
    • 或者,我们应该有多行来分隔选项。

    例如,

    ID    RiskControls
     1       1
     1       3
    

    另外,我还有另一个与数据导入相关的问题。

    1. 我们需要在哪里设置它,这个包会删除或删除表中所有现有行并再次插入所有行?
    2. 请帮我解决这个问题。

      谢谢你, 米塔尔。

2 个答案:

答案 0 :(得分:2)

这很奇怪,但今天论坛上还有另一个问题,看起来很相似:How to use Substring in SSIS

我建议解析脚本任务中的控件并将它们分成多行,如果这些对于分析很重要的话。相对而言,在SQL中执行此操作要困难得多。

对于您的其他问题,您可以使用执行SQL任务在数据流执行之前发出Truncate表语句。

答案 1 :(得分:0)

CREATE FUNCTION [dbo].[GetMultiLookupID] 
(
    @Value nvarchar(MAX)
) 
RETURNS @RtnValue table 
(
    Data int
) 
AS 
    BEGIN 
        SET @Value = REPLACE(@Value, ';#;#', ';#')
        Insert Into @RtnValue ([Data]) 
            SELECT a.value FROM (
                SELECT 
                    ROW_NUMBER() OVER(ORDER BY (SELECT NULL) ASC) AS Row#, 
                    [value] 
                FROM STRING_SPLIT(REPLACE(@Value,  ';#', NCHAR(9999)), NCHAR(9999))
            ) AS a WHERE Row# % 2 != 0
        Return
    END

SELECT * FROM dbo.GetMultiLookupID('1; #control 1;#3; #control 3')