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