SQL中以冒号分隔的键值拆分

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类型和

我正在将关键字传递给我的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类型和字符串函数使用
.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