使用定界符将 where 子句添加到 Sql 查询
Adding a where clause to Sql Query using delimiters
我有以下存储过程,它接受一个使用两个分隔符的字符串。该过程提取数据并插入到数据库中。就像我有一个键值对 (示例输入字符串) 说“10:1,11:2,12:3”,我也需要寻找值“10”在 "Id" 列中并在 "value" 列中插入值 1,依此类推。
程序代码如下:
ALTER PROCEDURE [SQL_Delimiter_TestProcedure]
@inputStr VARCHAR(MAX)
AS
BEGIN
DECLARE @t table (val varchar(500))
INSERT INTO @t (val)values (@inputStr)
;WITH CTE AS (
SELECT
Split.a.value('.', 'VARCHAR(500)') AS String
FROM (SELECT
CAST ('<M>' + REPLACE([val], ',', '</M><M>') + '</M>' AS XML) AS String
FROM @t) AS A CROSS APPLY String.nodes ('/M') AS Split(a))
INSERT INTO SQL_Delimiter_Test
select SUBSTRING(String,0,CHARINDEX(':',String)),REVERSE(SUBSTRING(reverse(String),0,CHARINDEX(':',reverse(String)))) from cte
END
我有类似的东西,我很快就为你改编了。我为此使用了udf。但是您可以提取所需的代码并在您的程序中轻松实现它。
在示例中,我生成了 udf 并使用它来拆分值对。之后,我对所有内容进行子字符串化以拆分键和值。
CREATE FUNCTION dbo.udf_split (@String nvarchar(max), @Delimiter nchar(1))
RETURNS @Results Table (Items nvarchar(max))
AS
BEGIN
DECLARE @Index int
DECLARE @Slice nvarchar(max)
SET @Index = 1
IF @String IS NULL RETURN
WHILE @Index != 0
BEGIN
SELECT @Index = CHARINDEX(@Delimiter, @String)
IF @Index != 0
SELECT @Slice = LEFT(@String, @Index - 1)
ELSE
SELECT @Slice = @String
INSERT INTO @Results(Items) VALUES (LTRIM(RTRIM(@Slice)))
SELECT @String = RIGHT(@String, LEN(@String) - @Index)
IF Len(@String) = 0 BREAK
END
RETURN
END
GO
SELECT SUBSTRING(split.Items,1,PATINDEX(N'%:%',split.items)-1), SUBSTRING(split.Items,PATINDEX(N'%:%',split.items)+1,LEN(split.items))
FROM dbo.udf_split('10:1,11:2,12:3',N',') as split
这是简短的版本:
首先,创建一个用户定义的 table 类型:
CREATE TYPE KeyValuePair As Table
(
Key int PRIMARY KEY,
Value int
)
然后将其用作存储过程中的 table 值参数:
ALTER PROCEDURE [SQL_Delimiter_TestProcedure]
(
@KeyValuePair as KeyValuePair readonly
)
AS
BEGIN
INSERT INTO SQL_Delimiter_Test (Id, Value)
SELECT Key, Value
FROM @KeyValuePair
END
可以在评论中的 the link provided by Damien_The_Unbeliever 中找到更多信息。
我有以下存储过程,它接受一个使用两个分隔符的字符串。该过程提取数据并插入到数据库中。就像我有一个键值对 (示例输入字符串) 说“10:1,11:2,12:3”,我也需要寻找值“10”在 "Id" 列中并在 "value" 列中插入值 1,依此类推。 程序代码如下:
ALTER PROCEDURE [SQL_Delimiter_TestProcedure]
@inputStr VARCHAR(MAX)
AS
BEGIN
DECLARE @t table (val varchar(500))
INSERT INTO @t (val)values (@inputStr)
;WITH CTE AS (
SELECT
Split.a.value('.', 'VARCHAR(500)') AS String
FROM (SELECT
CAST ('<M>' + REPLACE([val], ',', '</M><M>') + '</M>' AS XML) AS String
FROM @t) AS A CROSS APPLY String.nodes ('/M') AS Split(a))
INSERT INTO SQL_Delimiter_Test
select SUBSTRING(String,0,CHARINDEX(':',String)),REVERSE(SUBSTRING(reverse(String),0,CHARINDEX(':',reverse(String)))) from cte
END
我有类似的东西,我很快就为你改编了。我为此使用了udf。但是您可以提取所需的代码并在您的程序中轻松实现它。
在示例中,我生成了 udf 并使用它来拆分值对。之后,我对所有内容进行子字符串化以拆分键和值。
CREATE FUNCTION dbo.udf_split (@String nvarchar(max), @Delimiter nchar(1))
RETURNS @Results Table (Items nvarchar(max))
AS
BEGIN
DECLARE @Index int
DECLARE @Slice nvarchar(max)
SET @Index = 1
IF @String IS NULL RETURN
WHILE @Index != 0
BEGIN
SELECT @Index = CHARINDEX(@Delimiter, @String)
IF @Index != 0
SELECT @Slice = LEFT(@String, @Index - 1)
ELSE
SELECT @Slice = @String
INSERT INTO @Results(Items) VALUES (LTRIM(RTRIM(@Slice)))
SELECT @String = RIGHT(@String, LEN(@String) - @Index)
IF Len(@String) = 0 BREAK
END
RETURN
END
GO
SELECT SUBSTRING(split.Items,1,PATINDEX(N'%:%',split.items)-1), SUBSTRING(split.Items,PATINDEX(N'%:%',split.items)+1,LEN(split.items))
FROM dbo.udf_split('10:1,11:2,12:3',N',') as split
这是简短的版本:
首先,创建一个用户定义的 table 类型:
CREATE TYPE KeyValuePair As Table
(
Key int PRIMARY KEY,
Value int
)
然后将其用作存储过程中的 table 值参数:
ALTER PROCEDURE [SQL_Delimiter_TestProcedure]
(
@KeyValuePair as KeyValuePair readonly
)
AS
BEGIN
INSERT INTO SQL_Delimiter_Test (Id, Value)
SELECT Key, Value
FROM @KeyValuePair
END
可以在评论中的 the link provided by Damien_The_Unbeliever 中找到更多信息。