将字符串数组传递给存储过程

时间:2018-05-09 12:17:32

标签: arrays sql-server stored-procedures crystal-reports

首先,我理解这个问题之前已被问过几次,但其他帖子似乎来自源语言,可能是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

我不知道如何调整存储过程以将元素拆分为不同的字符串。 作为FYI,EXEC命令来自Crystal Reports。

1 个答案:

答案 0 :(得分:0)

您可以使用此函数将字符串中的数据解析为表数据类型。所以你传递它的字符串和分隔符,在我的例子中它将状态分成一个表来选择。

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

所以如果你的参数中包含这个字符串值,你可以使用where 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