Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 Server 2008 R2_Sql_Sql Server - Fatal编程技术网

从单元格中选择特定信息,包括其他信息SQL Server 2008 R2

从单元格中选择特定信息,包括其他信息SQL Server 2008 R2,sql,sql-server,Sql,Sql Server,我试图从一个变量中选择特定的信息,我将在下面解释这个场景 CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX)) RETURNS @returnList TABLE ([Name] [nvarchar] (500)) AS BEGIN DECLARE @name NVARCHAR(255) DECLARE @pos INT declare @l

我试图从一个变量中选择特定的信息,我将在下面解释这个场景

CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX))
RETURNS
    @returnList TABLE ([Name] [nvarchar] (500))

AS
BEGIN
    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    declare @len int = len(@delim)
    declare @nextchar int = 1
    declare @startofstring int = 1
    WHILE CHARINDEX(@delim, @stringToSplit) > 0
    BEGIN
        SELECT @pos  = CHARINDEX(@delim, @stringToSplit)  
        SELECT @name = SUBSTRING(@stringToSplit, @startofstring, @pos-@nextchar)

        INSERT INTO @returnList 
        SELECT @name

        SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+@nextchar+@len, LEN(@stringToSplit)-@pos)
    END
    INSERT INTO @returnList
    SELECT @stringToSplit

    RETURN
END

GO
模块向my db中的日志记录过程提供数据,并将其插入表中,例如:

IF(@EventID = 20)
BEGIN
    INSERT INTO _LogPvps 
    VALUES (@CharID, @Desc)
END
CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX))
RETURNS
    @returnList TABLE ([Name] [nvarchar] (500))

AS
BEGIN
    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    declare @len int = len(@delim)
    declare @nextchar int = 1
    declare @startofstring int = 1
    WHILE CHARINDEX(@delim, @stringToSplit) > 0
    BEGIN
        SELECT @pos  = CHARINDEX(@delim, @stringToSplit)  
        SELECT @name = SUBSTRING(@stringToSplit, @startofstring, @pos-@nextchar)

        INSERT INTO @returnList 
        SELECT @name

        SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+@nextchar+@len, LEN(@stringToSplit)-@pos)
    END
    INSERT INTO @returnList
    SELECT @stringToSplit

    RETURN
END

GO
@Desc
中有一个包含3个变量的文本字符串,我需要将其提取并添加到另一个表中,字符串示例:(变量1,2,3)

CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX))
RETURNS
    @returnList TABLE ([Name] [nvarchar] (500))

AS
BEGIN
    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    declare @len int = len(@delim)
    declare @nextchar int = 1
    declare @startofstring int = 1
    WHILE CHARINDEX(@delim, @stringToSplit) > 0
    BEGIN
        SELECT @pos  = CHARINDEX(@delim, @stringToSplit)  
        SELECT @name = SUBSTRING(@stringToSplit, @startofstring, @pos-@nextchar)

        INSERT INTO @returnList 
        SELECT @name

        SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+@nextchar+@len, LEN(@stringToSplit)-@pos)
    END
    INSERT INTO @returnList
    SELECT @stringToSplit

    RETURN
END

GO
我可以像这样通过1个变量进行拆分,但如果可能的话,我需要能够区分所有3个变量

IF @Desc LIKE '%My: Hunter, Neutral, no freebattle team%%His%%, Neutral, no freebattle team%%'
 BEGIN
     DECLARE @CNAME VARCHAR (64)
     DECLARE @JOB VARCHAR (16)

     SET @CNAME = (SELECT CHARNAME16 FROM DB_TEST.._Char WHERE CHARID = @CHARID) 
     SET @JOB = 'Hunter'

     INSERT INTO JOBKILLS 
     VALUES (@CHARID, @CNAME, @JOB, CURRENT_TIMESTAMP, @Desc)
 END

 IF @Desc LIKE '%My: Robber, Neutral, no freebattle team%%His%%, Neutral, no freebattle team%%'
 BEGIN
     DECLARE @CNAME VARCHAR (64)
     DECLARE @JOB VARCHAR (16)

     SET @CNAME = (SELECT CHARNAME16 FROM DB_TEST.._Char WHERE CHARID = @CHARID) 
     SET @JOB = 'Thief'

     INSERT INTO JOBKILLS 
     VALUES (@CHARID, @CNAME, @JOB, CURRENT_TIMESTAMP, @Desc)
 END

 IF @Desc LIKE '%My: Trader, Neutral, no freebattle team%%His%%, Neutral, no freebattle team%%'
 BEGIN
     DECLARE @CNAME VARCHAR (64)
     DECLARE @JOB VARCHAR (16)

     SET @CNAME = (SELECT CHARNAME16 FROM DB_TEST.._Char WHERE CHARID = @CHARID) 
     SET @JOB = 'Trader'

     INSERT INTO JOBKILLS 
     VALUES (@CHARID, @CNAME, @JOB, CURRENT_TIMESTAMP, @Desc)
 END
CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX))
RETURNS
    @returnList TABLE ([Name] [nvarchar] (500))

AS
BEGIN
    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    declare @len int = len(@delim)
    declare @nextchar int = 1
    declare @startofstring int = 1
    WHILE CHARINDEX(@delim, @stringToSplit) > 0
    BEGIN
        SELECT @pos  = CHARINDEX(@delim, @stringToSplit)  
        SELECT @name = SUBSTRING(@stringToSplit, @startofstring, @pos-@nextchar)

        INSERT INTO @returnList 
        SELECT @name

        SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+@nextchar+@len, LEN(@stringToSplit)-@pos)
    END
    INSERT INTO @returnList
    SELECT @stringToSplit

    RETURN
END

GO
那么,我如何才能选择每个变量,从而不能将它们设置为标量变量,并将它们插入到单独表中的各个列中呢

CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX))
RETURNS
    @returnList TABLE ([Name] [nvarchar] (500))

AS
BEGIN
    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    declare @len int = len(@delim)
    declare @nextchar int = 1
    declare @startofstring int = 1
    WHILE CHARINDEX(@delim, @stringToSplit) > 0
    BEGIN
        SELECT @pos  = CHARINDEX(@delim, @stringToSplit)  
        SELECT @name = SUBSTRING(@stringToSplit, @startofstring, @pos-@nextchar)

        INSERT INTO @returnList 
        SELECT @name

        SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+@nextchar+@len, LEN(@stringToSplit)-@pos)
    END
    INSERT INTO @returnList
    SELECT @stringToSplit

    RETURN
END

GO
例如:

INSERT INTO JOBKILLS 
VALUES (@CHARID, @CNAME, @JOB,
        @variant1, @variant2, @variant3,
        CURRENT_TIMESTAMP, @Desc)
CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX))
RETURNS
    @returnList TABLE ([Name] [nvarchar] (500))

AS
BEGIN
    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    declare @len int = len(@delim)
    declare @nextchar int = 1
    declare @startofstring int = 1
    WHILE CHARINDEX(@delim, @stringToSplit) > 0
    BEGIN
        SELECT @pos  = CHARINDEX(@delim, @stringToSplit)  
        SELECT @name = SUBSTRING(@stringToSplit, @startofstring, @pos-@nextchar)

        INSERT INTO @returnList 
        SELECT @name

        SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+@nextchar+@len, LEN(@stringToSplit)-@pos)
    END
    INSERT INTO @returnList
    SELECT @stringToSplit

    RETURN
END

GO

另一种解释方式是,A-B-C根据用户ingame的操作而变化,我需要从@Desc字符串中选取所有3个,并将它们放在另一个表中的单独列中

[My: **A**, Neutral, no freebattle team] [His(**B**): **C**, Neutral, no freebattle team]
CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX))
RETURNS
    @returnList TABLE ([Name] [nvarchar] (500))

AS
BEGIN
    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    declare @len int = len(@delim)
    declare @nextchar int = 1
    declare @startofstring int = 1
    WHILE CHARINDEX(@delim, @stringToSplit) > 0
    BEGIN
        SELECT @pos  = CHARINDEX(@delim, @stringToSplit)  
        SELECT @name = SUBSTRING(@stringToSplit, @startofstring, @pos-@nextchar)

        INSERT INTO @returnList 
        SELECT @name

        SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+@nextchar+@len, LEN(@stringToSplit)-@pos)
    END
    INSERT INTO @returnList
    SELECT @stringToSplit

    RETURN
END

GO

在我看来,这似乎是一个将字符串拆分为多个部分,然后将它们添加到表中的问题。这个问题已经解决了好几次了。但是,如果问题与此不同,那么请添加一些进一步的细节,说明为什么您的问题是唯一的。下面是拆分字符串并返回表的代码。不用说,您可能需要修改它以满足您的特定需求

CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @delim VARCHAR(MAX))
RETURNS
    @returnList TABLE ([Name] [nvarchar] (500))

AS
BEGIN
    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    declare @len int = len(@delim)
    declare @nextchar int = 1
    declare @startofstring int = 1
    WHILE CHARINDEX(@delim, @stringToSplit) > 0
    BEGIN
        SELECT @pos  = CHARINDEX(@delim, @stringToSplit)  
        SELECT @name = SUBSTRING(@stringToSplit, @startofstring, @pos-@nextchar)

        INSERT INTO @returnList 
        SELECT @name

        SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+@nextchar+@len, LEN(@stringToSplit)-@pos)
    END
    INSERT INTO @returnList
    SELECT @stringToSplit

    RETURN
END

GO

抱歉,无法理解
变体
零件。你能用一种更简单的方式来描述它吗?a-B-C的变化取决于用户ingame所做的事情,我需要从@Desc字符串中选取所有3个,并将它们放在另一个表中的单独列中。[我的:A,中立,没有自由战斗队][他的(B):C,中立,没有自由战斗队]嗨,在我看来,把这个字符串分成几个部分,然后将它们添加到表中是一个问题。这个问题已经解决了好几次了。但是,如果问题与此不同,那么请添加一些进一步的细节,说明为什么您的问题是唯一的。下面是拆分字符串并返回表的代码。