ฉันกำลังส่งคำหลักไปยัง SP ของฉันโดยพูดว่า @Keyword คำสำคัญนี้อาจรวมถึง
param1:value1 param2:value2
param1:value1
param2:value2
ฉันจะคว้าค่า 1 และค่า 2 ได้อย่างไร
ฉันกำลังส่งคำหลักไปยัง SP ของฉันโดยพูดว่า @Keyword คำสำคัญนี้อาจรวมถึง
param1:value1 param2:value2
param1:value1
param2:value2
ฉันจะคว้าค่า 1 และค่า 2 ได้อย่างไร
คุณสามารถใช้ .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
param1:value1 param2:value2
จะทำงานอย่างไร
- person ughai; 11.05.2015
แค่ใส่ param1 และ param2 เป็นพารามิเตอร์ในกระบวนงานที่เก็บไว้ของคุณล่ะ?
CREATE PROCEDURE procedurename
@param1 datatype
, @param2 datatype
AS
content here
GO
นี่เป็นอีกวิธีหนึ่งในการใช้ฟังก์ชันแยก ดูบทความโดย 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
อย่าใช้สตริงที่คั่น ให้ใช้พารามิเตอร์ค่าตารางแทน
สร้าง ประเภทตารางที่ผู้ใช้กำหนด ที่มี 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
เป็นตารางในกระบวนงานที่เก็บไว้เพื่อทำการเลือก รวม หรือสิ่งที่คุณต้องการ
name:abc value:good
หรือไม่ - person user960567   schedule 11.05.2015