从单元格中选择特定信息,包括其他信息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,中立,没有自由战斗队]嗨,在我看来,把这个字符串分成几个部分,然后将它们添加到表中是一个问题。这个问题已经解决了好几次了。但是,如果问题与此不同,那么请添加一些进一步的细节,说明为什么您的问题是唯一的。下面是拆分字符串并返回表的代码。