Передача строкового массива в хранимую процедуру - PullRequest
0 голосов
/ 09 мая 2018

Для начала я понимаю, что этот вопрос задавался несколько раз ранее, но другие сообщения, похоже, исходят из исходного языка, возможно, c # или чего-то еще. У меня нет такой роскоши.

В основном я пишу хранимый процесс в SQL Server 2012.

CREATE PROCEDURE MyStoredProc 
    @MyDate DATETIME,
    @StringVariable1 nvarchar(50),
    @StringVariable2 nvarchar(1000)
AS
BEGIN
 ...  do my stored proc
END

Обычно для запуска хранимого процесса мне дают

EXEC MyStoredProc '2018-05-09 00:00:00', 'Heres a string', ('aaa','bbb','eee')

Так что у меня нет способа изменить инструкцию EXEC или значения, передаваемые в хранимый процесс. У меня есть только возможность изменить хранимую процедуру. Как видите, @ StringVariable2 проходит как массив строковых значений. Мне нужно прочитать каждый элемент массива в отдельности, чтобы выполнить необходимую функциональность хранимого процесса. В качестве примера, скажем, у меня есть таблица со следующими столбцами

ITEM
DESCRIPTION
Feature1
Feature2
Feature3
Feature4

Мне нужно написать предложение where, которое будет выглядеть примерно так:

SELECT * from MyTable where Feature1 = @FirstArrayElement and Feature2 = @SecondArrayElement and Feature3 = @ThirdArrayElement

Просто не уверен, как я могу настроить хранимую процедуру, чтобы разделить элементы на разные строки. К вашему сведению, команда EXEC поступает из Crystal Reports.

1 Ответ

0 голосов
/ 09 мая 2018

Вы можете использовать эту функцию для анализа данных из строки в тип данных таблицы.Таким образом, вы передаете ему строку и разделитель, в моем примере он разделит состояния на таблицу для выбора.

Select * FROM dbo.fn_splitDelimitedInotTable('MI,AR,TE', ',')


ALTER FUNCTION [dbo].[fn_splitDelimitedInotTable](
    @delimited NVARCHAR(MAX),
    @delimiter NVARCHAR(100)
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
    DECLARE @xml XML
    SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
    INSERT INTO @t(val)
    SELECT  r.value('.','varchar(MAX)') AS item
    FROM  @xml.nodes('/t') AS records(r)
    RETURN
END

, поэтому, если в вашем параметре есть это строковое значение, вы бы вызвали такую ​​функцию, какэто где id = 1, чтобы получить первый параметр:

Select * FROM dbo.fn_splitDelimitedInotTable('aaa','bbb','eee', ',') where id=1

вернет aaa

, тогда

Select * FROM dbo.fn_splitDelimitedInotTable('aaa','bbb','eee', ',') where id=2

вернет bbb

и

----- ОБНОВЛЕНО, чтобы показать, что я добавил в комментарии

-- recreate the varaible from the SP passed (using double quotes for escape characters to create the data that is passed)

DECLARE @StringVariable2 nvarchar(1000)
SET @StringVariable2 = '(''aaa'',''bbb'',''eee'')'

-- this statement removes the parens
SET @StringVariable2 = REPLACE(REPLACE(@StringVariable2, '(', ''), ')', '') 

-- just test selects it with no parems
SELECT @StringVariable2

-- returns the first vaiable from the string so 'aaa'
SELECT * FROM dbo.fn_splitDelimitedInotTable(@StringVariable2, ',') where id=1
...