Pisahkan nilai kunci yang dipisahkan titik dua dalam SQL

Saya meneruskan kata kunci ke SP saya, katakan @Keyword. Kata kunci ini mungkin termasuk

param1:value1 param2:value2

param1:value1 

param2:value2

Bagaimana saya bisa mengambil nilai1 dan nilai2?


person user960567    schedule 11.05.2015    source sumber
comment
Berikan Beberapa Contoh Data, sehingga akan mudah untuk memberikan jawaban yang tepat   -  person Hell Boy    schedule 11.05.2015
comment
Sudahkah Anda menggunakan penelusuran di situs seperti name:abc value:good   -  person user960567    schedule 11.05.2015
comment
Jadi Anda perlu mengambil 'abc' dan 'Good' secara terpisah kan? Beri saya nilai Contoh yang Anda lewati di @kata kunci.   -  person Hell Boy    schedule 11.05.2015
comment
Bisakah saya menjadi orang jahat di sini, dan bertanya mengapa Anda ingin melakukannya dengan cara ini? Gunakan parameter bernilai tabel.   -  person Bridge    schedule 11.05.2015
comment
@Bridge, saya hanya perlu menggunakan fungsi ini di mana saja   -  person user960567    schedule 11.05.2015
comment
Jangan meneruskan argumen gabungan ke prosedur tersimpan seperti itu. gunakan parameter nilai tabel. baca ini.   -  person Zohar Peled    schedule 11.05.2015


Jawaban (4)



Anda dapat menggunakan .nodes untuk tipe xml dan fungsi string seperti LEFT / CHARINDEX / SUBSTRING untuk mencapai ini

Kueri

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

Jika memungkinkan, Anda harus menggunakan parameter statis. jika tidak, saya sarankan Anda dapat menggunakan parameter nilai Tabel atau xml secara langsung sebagai parameter.

Catatan: Kode di atas mengasumsikan bahwa spasi <x>,</x> dan ' ' bukan param atau nilai yang valid.

Ini cara lain,

            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
Tapi bisa jadi apa saja :( - person user960567; 11.05.2015
comment
baik jika spasi juga diperbolehkan sebagai nilai, bagaimana cara kerja pemisahan param1:value1 param2:value2? - person ughai; 11.05.2015
comment
Memperbarui jawaban Anda karena saya juga menemukan caranya. - person user960567; 11.05.2015
comment
Karena jawaban Anda pada dasarnya berbeda dengan jawaban saya, saya sarankan Anda membuat jawaban baru atau lebih baik lagi menambahkannya dalam pertanyaan Anda sebagai edit dan menyebutkan bahwa inilah yang telah Anda coba sejauh ini. - person ughai; 11.05.2015

Bagaimana kalau menempatkan param1 dan param2 sebagai parameter pada prosedur tersimpan Anda?

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

Berikut cara lain menggunakan fungsi split. Lihat artikel ini oleh Jeff Moden untuk referensi.

Pada dasarnya, Anda ingin membagi @keyword Anda menggunakan ' ' (spasi) sebagai pembatas. Kemudian menggunakan beberapa fungsi string seperti LEFT, SUBSTRING, dan CHARINDEX, Anda dapat mengekstrak param dan value-nya.

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

Jangan gunakan string yang dibatasi, gunakan parameter nilai dalam tabel sebagai gantinya.
Buat jenis tabel yang ditentukan pengguna yang berisi 2 kolom: paramName dan nilai:

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
)

Kemudian cukup deklarasikan parameter @keyword sebagai tipe ini:

CREATE PROCEDURE stp_doWhatever 
(
    @Keyword dbo.Keywords READONLY -- Note: Readonly is a must!
)
AS
-- do whatever

Anda dapat menggunakan @keyword sebagai tabel dalam prosedur tersimpan untuk melakukan pemilihan, penggabungan, apa pun yang Anda perlukan.

person Zohar Peled    schedule 11.05.2015