Проблема с разделением значений и передачей в хранимую процедуру - PullRequest
0 голосов
/ 28 июня 2018

Я получаю следующие значения входных параметров в одной из хранимых процедур.

@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 голосов
/ 28 июня 2018

Я чувствую, что у вас есть строка пар (ключ, значение). Возможно, что-то вроде этого:

* ** 1003 тысяча два * Пример
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
0 голосов
/ 28 июня 2018

Может быть, следующий код подойдет вам.

Использование определяемой пользователем переменной типа таблицы.

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.

А затем позвоните своему второму ИП.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...