SSIS как да прехвърлите параметъра Table-Value в съхранена процедура

В интернет има множество статии за предаване на параметъра Table-Value в SSIS, но се чудя, че всички те са много стари и грешни като прекалено сложни, защото искат компоненти на скрипта или много други неща да бъдат направени.

Така че въпросите са.

  1. Как да прехвърлите параметър Table-Value в ADO.NET Source.
  2. Как да прехвърлите параметъра Table-Value в OLE DB Source.

Как да го направите по най-ефективния и бърз начин

Да приемем, че параметърът на стойността на таблицата е дефиниран като тип

CREATE TYPE [dbo].[IDs_TVP] AS TABLE(
    [ID] [INT] NOT NULL
)

и процедурата може да бъде извикана

DECLARE @ID dbo.IDs_TVP
INSERT INTO @Clients
(
    Text
)
VALUES 
('1'),
('1'),
('3')

EXEC dbo.GetClients  @Clients = @Clients

и определена процедура

CREATE PROCEDURE [dbo].[GetClients]

    @Clients dbo.IDs_TVP READONLY
AS

SELECT * FROM @Clients

person justromagod    schedule 24.09.2018    source източник
comment
Ако използвате SQL Server 2017, можете да изпратите JSON директно, това ще спести създаване на тип таблица за всяка съхранена процедура   -  person Pranav Singh    schedule 24.09.2018
comment
Питате ли как да предадете стойност от c#, тъй като знаете как да използвате параметър със стойност на таблица в съхранена процедура?   -  person Pranav Singh    schedule 24.09.2018
comment
Става въпрос за SSIS и извикването на Spc вътре в SSIS и в момента изглежда може да се направи само в компонент C# на скрипта, което от моя гледна точка е прекалено сложно.   -  person justromagod    schedule 24.09.2018


Отговори (1)


Не съм сигурен колко по-малко подробна би била тази опция от скриптова задача, но ако трябва да използвате параметър със стойност на таблица, за да прехвърлите данни в a в съхранена процедура, след работа с тези данни в множество компоненти в пакета, може да зареди данните в глобална временна таблица, за да извърши каквато и да е необходима обработка. След като сте готови да изпратите данните в съхранената процедура, като използвате параметъра със стойност на таблицата, попълнете T-SQL променлива от същия тип като TVP и изпълнете съхранената процедура с тази променлива като TVP параметър. За да направите това, не забравяйте да поставите всички свързани задачи в контейнер за последователност, който има TransactionOption, зададен на Задължително. Компонентите могат или да имат своите TransactionOption на Поддържани, или също да бъдат зададени на Задължителни. Ако всички компоненти в пакета са свързани с тази конкретна цел/данни, контейнерът Sequence може да бъде пропуснат и вместо това същата настройка TransactionOption ще се приложи към пакета. Ако този подход работи за вас, може да помислите за премахване на TVP от съхранената процедура и просто да използвате временната таблица. По-долу е даден пример за изпълнение на SQL задача, която попълва променлива от тип таблица от временната таблица, след което изпълнява съхранената процедура с това като параметър. Това ще работи както с OLE DB, така и с ADO.NET връзки

DECLARE @YourParameter AS IDs_TVP

INSERT INTO @YourParameter (ID)
SELECT ID FROM ##TempTable

EXEC dbo.TestSP @YourParameter

DROP TABLE ##TempTable
person userfl89    schedule 24.09.2018
comment
При мен се получи. Благодаря за помощта. Възможно е дори да създадете Expression Task и да изградите този SQL. - person justromagod; 25.09.2018
comment
stackoverflow .com/questions/20093362/ =› ADO.NET динамичен SQL - person justromagod; 25.09.2018