Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用分隔符向Sql查询添加where子句_Sql_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

使用分隔符向Sql查询添加where子句

使用分隔符向Sql查询添加where子句,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我有以下存储过程,它接受使用两个分隔符的字符串。该过程提取数据并插入数据库。这就像如果我有一个键值对示例输入字符串,比如'10:1,11:2,12:3',我也需要在Id列中查找值'10',并在Value列中插入值1,依此类推。 程序代码如下: ALTER PROCEDURE [SQL_Delimiter_TestProcedure] @inputStr VARCHAR(MAX) AS BEGIN DECLARE @t table (val varchar(500)) INSERT INTO

我有以下存储过程,它接受使用两个分隔符的字符串。该过程提取数据并插入数据库。这就像如果我有一个键值对示例输入字符串,比如'10:1,11:2,12:3',我也需要在Id列中查找值'10',并在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

以下是简短的版本:

首先,创建一个用户定义的表类型:

CREATE TYPE KeyValuePair As Table
(
    Key int PRIMARY KEY,
    Value int
)
然后将其用作存储过程中的表值参数:

ALTER PROCEDURE [SQL_Delimiter_TestProcedure]
(
   @KeyValuePair as KeyValuePair readonly
)
AS
BEGIN

INSERT INTO SQL_Delimiter_Test (Id, Value)
SELECT Key, Value
FROM @KeyValuePair

END

更多信息可以在注释中找到。为什么不使用表值参数?它们设计用于在多个列中传递具有多个值的结构化数据。与字符串相反。但事实并非如此。@Damien_The_unsiver:你能建议我如何实施这样一个查询或给出一个样本吗。我不熟悉使用分隔符,因此没有太多想法。我还有一个机会发布到Erland Sommarskog的链接-想法是您不使用分隔符-有些类型设计用于保存多个值,您可以使用其中一个。不能使用表值。。只需要使用分隔符。上面提到的过程可以完成这项工作,但唯一缺少的是where子句。我们是否有办法更新现有的程序本身@达米恩·不信者