拆分值并传递给存储过程的问题

时间:2018-06-28 11:29:41

标签: sql-server tsql

我在存储过程之一中获取以下输入参数值。

@DocKey1, @DocValue1, 
@DocKey2, @DocValue2, 
@DocKey3, @DocValue3, 
@DocKey4, @DocValue4, 
@DocKey5, @DocValue5

从该过程中,我将调用另一个过程以插入每对值。

现在,我多次调用InsertDocValues存储过程以插入每一对。

exec InsertDocValues @DocKey1, @DocValue1
exec InsertDocValues @DocKey2, @DocValue2
exec InsertDocValues @DocKey3, @DocValue3
exec InsertDocValues @DocKey4, @DocValue4
exec InsertDocValues @DocKey5, @DocValue5

无论如何,我可以将完整的一组值传递给另一个过程,如下所示,然后拆分每对并插入 例如:@DocKey1, @DocValue1 and @DocKey2, @DocValue2 etc

@DocKey1, @DocValue1, @DocKey2, @DocValue2, @DocKey3, @DocValue3, @DocKey4, @DocValue4, @DocKey5, @DocValue5

下面是程序正在使用的插入

 Create PROCEDURE [dbo].[InsertDocValues]    
(    
    @DocKey     varchar(20),
    @DocValue   nvarchar(20)
)     
AS       

SET NOCOUNT ON;      

BEGIN       

  INSERT INTO dbo.DocValues(
    DocKey,
    DocValue
  )      
  VALUES(      
    @DocKey,
    @DocValue               
  )      
  End

请提出建议

2 个答案:

答案 0 :(得分:2)

也许下面的代码对您有用。

使用用户定义的表类型变量。

CREATE TYPE DocTable AS TABLE   
( 
  DocKey int, 
  DocValue nvarchar(50)
);
GO

然后使用此类型在第一个SP中创建所需的变量,并将其传递给第二个SP。

DECLARE @DocTable AS DocTable;
INSERT INTO @DocTable
SELECT @DocKey1, @DocValue1 UNION ALL
SELECT @DocKey2, @DocValue2 UNION ALL
SELECT @DocKey3, @DocValue3 UNION ALL
SELECT @DocKey4, @DocValue4 UNION ALL
SELECT @DocKey5, @DocValue5

您也可以动态创建上述插入查询。填充表格的方法有很多。因此,从第一个SP获取输出时,请使用任何一个。

然后致电您的第二个SP。

EXEC [dbo].[InsertDocValues] @DocTable

第二个SP的更改如下所示。

Create PROCEDURE [dbo].[InsertDocValues] 
(
    @DocTable DocTable READONLY
)
AS       
SET NOCOUNT ON;
BEGIN       
    INSERT INTO dbo.DocValues(
        DocKey,
        DocValue
    )      
    SELECT 
        DocKey,
        DocValue 
    FROM @DocTable     
END

答案 1 :(得分:1)

我感觉到您有一对字符串(键,值)。也许是这样的:

示例

Declare @List varchar(max) = 'Key1:Value1,Key2:Value2'

Insert Into dbo.DocValues(DocKey,DocValue )      
Select DocKey = left(RetVal,charindex(':',RetVal+':')-1)
      ,DocVal = stuff(RetVal,1,charindex(':',RetVal+':'),'')
 From (
        Select RetSeq = row_number() over (Order By (Select null))
              ,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
        From  (Select x = Cast('<x>' + replace((Select replace(@List,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) A

插入的数据将是

DocKey  DocVal
Key1    Value1
Key2    Value2