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

时间:2015-05-11 07:37:47

标签: sql sql-server sql-server-2012

我将关键字传递给我的SP说@Keyword。此关键字可能包含

param1:value1 param2:value2

param1:value1 

param2:value2

我怎样才能获取value1和value2?

4 个答案:

答案 0 :(得分:3)

您可以将.nodes用于xml类型和字符串函数(如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

如果可能,您应该使用静态参数。如果不是我建议你可以直接使用Table值参数或xml作为参数。

注意:以上代码假定<x></x>' '空格无效param或值。 < / p>

这是另一种方式,

            ALTER FUNCTION [dbo].[GetValueByKey]
            (
                @Key nvarchar(max)
                ,@Str nvarchar(max)
            )
            RETURNS NVARCHAR(MAX)
            AS
            BEGIN

                DECLARE @Result nvarchar(max) = '';
                DECLARE @KeyIndex int = 0; 
                DECLARE @SpaceIndex int = 0; 

                SELECT @KeyIndex = CHARINDEX(@Key + ':', @Str);

                IF(@KeyIndex > 0)
                BEGIN
                    SET @KeyIndex = @KeyIndex + LEN(@Key) + 1;
                    SET @Result = SUBSTRING(@Str, @KeyIndex, LEN(@Str) - @KeyIndex + 1);
                    SELECT @SpaceIndex = CHARINDEX(' ', @Result);
                    IF(@SpaceIndex <= 1)
                    BEGIN
                        SET @SpaceIndex = LEN(@Result)  +1;
                    END
                    SELECT @Result = SUBSTRING(@Result, 0, @SpaceIndex)
                END

                RETURN @Result;
            END

答案 1 :(得分:2)

如何将param1和param2作为参数存储到存储过程中?

CREATE PROCEDURE procedurename
    @param1   datatype
  , @param2   datatype
AS
  content here
GO

答案 2 :(得分:2)

以下是使用拆分功能的另一种方法。请参阅Jeff Moden的article作为参考。

基本上,您希望使用@keyword(空格)作为分隔符来分割' '。然后使用一些字符串函数,例如LEFTSUBSTRINGCHARINDEX,您可以提取param及其value

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

答案 3 :(得分:1)

请勿使用分隔字符串,而是使用tabled value parameter 创建一个包含2列的user defined table type: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

您可以使用@keyword作为存储过程中的表来执行选择,连接,无论您需要什么。