แยกค่าคีย์ที่คั่นด้วยโคลอนใน SQL

ฉันกำลังส่งคำหลักไปยัง SP ของฉันโดยพูดว่า @Keyword คำสำคัญนี้อาจรวมถึง

param1:value1 param2:value2

param1:value1 

param2:value2

ฉันจะคว้าค่า 1 และค่า 2 ได้อย่างไร


person user960567    schedule 11.05.2015    source แหล่งที่มา
comment
ให้ข้อมูลตัวอย่างบางส่วน ดังนั้นจึงง่ายต่อการให้คำตอบที่แน่นอนแก่คุณ   -  person Hell Boy    schedule 11.05.2015
comment
คุณเคยใช้การค้นหาในไซต์เช่น name:abc value:good หรือไม่   -  person user960567    schedule 11.05.2015
comment
ดังนั้นคุณต้องแยก 'abc' และ 'Good' แยกกันใช่ไหม ขอตัวอย่างค่าที่คุณส่งผ่าน @keyword   -  person Hell Boy    schedule 11.05.2015
comment
ฉันขอเป็นคนเลวที่นี่ได้ไหมและถามว่าทำไมคุณถึงทำแบบนี้? ใช้พารามิเตอร์ที่มีค่าของตาราง   -  person Bridge    schedule 11.05.2015
comment
@Bridge ฉันแค่ต้องใช้ฟังก์ชั่นนี้ทุกที่   -  person user960567    schedule 11.05.2015
comment
อย่าส่งผ่านอาร์กิวเมนต์แบบผสมไปยังขั้นตอนการจัดเก็บเช่นนั้น ใช้พารามิเตอร์ค่าตาราง อ่านข้อความนี้   -  person Zohar Peled    schedule 11.05.2015


คำตอบ (4)



คุณสามารถใช้ .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

หากเป็นไปได้ คุณควรใช้พารามิเตอร์คงที่ ถ้าไม่ฉันขอแนะนำให้คุณใช้พารามิเตอร์ที่มีค่าของตารางหรือ xml เป็นพารามิเตอร์โดยตรง

หมายเหตุ: โค้ดด้านบนถือว่าช่องว่าง <x>,</x> และ ' ' ไม่ใช่พารามิเตอร์หรือค่าที่ถูกต้อง

นี่เป็นอีกวิธีหนึ่ง

            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
person ughai    schedule 11.05.2015
comment
แต่มันจะเป็นอะไรก็ได้ :( - person user960567; 11.05.2015
comment
ถ้าอนุญาตให้เว้นวรรคเป็นค่าได้ การแยก param1:value1 param2:value2 จะทำงานอย่างไร - person ughai; 11.05.2015
comment
อัปเดตคำตอบของคุณเพราะฉันพบวิธีแล้ว - person user960567; 11.05.2015
comment
เนื่องจากคำตอบของคุณโดยพื้นฐานแล้วแตกต่างไปจากของฉัน ฉันขอแนะนำให้คุณสร้างคำตอบใหม่หรือดีกว่านั้นเพิ่มในคำถามของคุณเพื่อเป็นการแก้ไข และระบุว่านี่คือสิ่งที่คุณได้ลองมาแล้ว - person ughai; 11.05.2015

แค่ใส่ param1 และ param2 เป็นพารามิเตอร์ในกระบวนงานที่เก็บไว้ของคุณล่ะ?

CREATE PROCEDURE procedurename
    @param1   datatype
  , @param2   datatype
AS
  content here
GO
person Toby    schedule 11.05.2015

นี่เป็นอีกวิธีหนึ่งในการใช้ฟังก์ชันแยก ดูบทความโดย Jeff Moden นี้เพื่อเป็นข้อมูลอ้างอิง

โดยพื้นฐานแล้ว คุณต้องการแยก @keyword ของคุณโดยใช้ ' ' (ช่องว่าง) เป็นตัวคั่น จากนั้นใช้ฟังก์ชันสตริงบางอย่าง เช่น LEFT, SUBSTRING และ CHARINDEX คุณสามารถแยก 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
person Felix Pamittan    schedule 11.05.2015

อย่าใช้สตริงที่คั่น ให้ใช้พารามิเตอร์ค่าตารางแทน
สร้าง ประเภทตารางที่ผู้ใช้กำหนด ที่มี 2 คอลัมน์: 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 เป็นตารางในกระบวนงานที่เก็บไว้เพื่อทำการเลือก รวม หรือสิ่งที่คุณต้องการ

person Zohar Peled    schedule 11.05.2015