SQL中以冒号分隔的键值拆分
我正在将关键字传递给我的SP say@keyword。此关键字可能包括SQL中以冒号分隔的键值拆分,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我正在将关键字传递给我的SP say@keyword。此关键字可能包括 param1:value1 param2:value2 param1:value1 param2:value2 如何获取value1和value2?将param1和param2作为存储过程的参数如何 CREATE PROCEDURE procedurename @param1 datatype , @param2 datatype AS content here GO 您可以对xml类型和
param1:value1 param2:value2
param1:value1
param2:value2
如何获取value1和value2?将param1和param2作为存储过程的参数如何
CREATE PROCEDURE procedurename
@param1 datatype
, @param2 datatype
AS
content here
GO
您可以对xml类型和字符串函数使用
.nodes
,如LEFT/CHARINDEX/SUBSTRING
查询
DECLARE @v VARCHAR(MAX) = 'param1:value1 param2:value2'
DECLARE @xml xml = '<x>' + REPLACE(@v,' ','</x><x>') + '</x>'
;WITH CTE AS
(
SELECT c.value('.','NVARCHAR(MAX)') as val
FROM @xml.nodes('x') t(c)
)
SELECT
LEFT(val,CHARINDEX(':',val)-1),
SUBSTRING(val,CHARINDEX(':',val)+1,LEN(val)-CHARINDEX(':',val))
FROM cte
下面是使用拆分函数的另一种方法。请参阅Jeff Moden的这篇文章以供参考 基本上,您希望使用
'
(空格)作为分隔符拆分@关键字。然后使用一些字符串函数,如LEFT
、SUBSTRING
和CHARINDEX
,可以提取参数及其值
DECLARE @keyword VARCHAR(8000)
SELECT @keyword = 'param1:value1 param2:value2'
;WITH CteSpace AS(
SELECT *
FROM dbo.DelimitedSplit8K(@keyword, ' ')
)
SELECT
Param = LEFT(Item, CHARINDEX(':', Item) - 1),
Value = SUBSTRING(Item, CHARINDEX(':', Item) +1, LEN(Item) - CHARINDEX(':', Item))
FROM CteSpace
不要使用带分隔符的字符串,而是使用分隔符。
创建一个包含两列的参数:paramName和value:
CREATE TYPE Keywords AS Table
(
Keyword_ParamName varchar(10), -- or whatever length that suits your needs
Keyword_value varchar(200), -- or whatever length that suits your needs
)
然后只需将@keyword
参数声明为以下类型:
CREATE PROCEDURE stp_doWhatever
(
@Keyword dbo.Keywords READONLY -- Note: Readonly is a must!
)
AS
-- do whatever
您可以使用@关键字作为存储过程中的一个表来执行选择、连接等任何需要的操作。给出一些示例数据,这样就很容易给出确切的答案。您是否使用过类似名称:abc值:good
这样的网站搜索,所以您需要分别获取“abc”和“good”对吗?给我一个例子,值u传入@keyword。我能成为这里的坏人吗,并问你为什么要这样做?使用表值参数。不要像那样将复合参数传递给存储过程。使用表值参数。但它可以是任何东西:(如果也允许空格作为值,拆分param1:value1 param2:value2
将如何工作?更新您的答案,因为我也找到了一种方法。由于您的答案与我的答案根本不同,我建议您创建一个新答案,或者更好地将其作为编辑添加到您的问题中,并提及这就是您所拥有的答案。)到目前为止,我一直很兴奋。
CREATE PROCEDURE stp_doWhatever
(
@Keyword dbo.Keywords READONLY -- Note: Readonly is a must!
)
AS
-- do whatever