Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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连接字符串_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL连接字符串

SQL连接字符串,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在SQLServer2008中工作,我想连接两个字符串,条件是 @str1 = 'A1,B1,C1' @str2 = 'A2,B2,C2' 我希望结果是一样的 @result = 'A1,A2,B1,B2,C1,C2' 请帮助…首先创建一个拆分函数以分别获取项目: CREATE FUNCTION [dbo].[Split] ( @String NVARCHAR(4000), @Delimiter NCHAR(1) ) RETURNS TABLE AS RETURN (

我在SQLServer2008中工作,我想连接两个字符串,条件是

@str1 = 'A1,B1,C1'
@str2 = 'A2,B2,C2'
我希望结果是一样的

@result = 'A1,A2,B1,B2,C1,C2'

请帮助…

首先创建一个拆分函数以分别获取项目:

CREATE FUNCTION [dbo].[Split]
(
    @String NVARCHAR(4000),
    @Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
    WITH Split(stpos,endpos)
    AS(
        SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
        UNION ALL
        SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
            FROM Split
            WHERE endpos > 0
    )
    SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
        'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
    FROM Split
)
GO
现在,您可以先拆分,然后对结果排序,然后计算值

DECLARE @DelimitedString NVARCHAR(128)
SET @DelimitedString =  @str1 + ',' + @str2
SELECT @result = COALESCE(@result + ',', '') +Data
  FROM (SELECT Data 
          FROM dbo.Split(@DelimitedString, ',')
      ORDER BY Data)

首先创建一个拆分函数,分别获取项目:

CREATE FUNCTION [dbo].[Split]
(
    @String NVARCHAR(4000),
    @Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
    WITH Split(stpos,endpos)
    AS(
        SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
        UNION ALL
        SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
            FROM Split
            WHERE endpos > 0
    )
    SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
        'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
    FROM Split
)
GO
现在,您可以先拆分,然后对结果排序,然后计算值

DECLARE @DelimitedString NVARCHAR(128)
SET @DelimitedString =  @str1 + ',' + @str2
SELECT @result = COALESCE(@result + ',', '') +Data
  FROM (SELECT Data 
          FROM dbo.Split(@DelimitedString, ',')
      ORDER BY Data)
更新1

我认为最好的方法是,首先获取完整字符串,然后用逗号将其拆分,然后将其存储在临时表中,然后进行排序,这可能是一个好主意

CREATE FUNCTION SplitString
(    
      @Input NVARCHAR(MAX),
      @Character CHAR(1)
)
RETURNS @Output TABLE (
      Item NVARCHAR(1000)
)
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT

      SET @StartIndex = 1
      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
      BEGIN
            SET @Input = @Input + @Character
      END

      WHILE CHARINDEX(@Character, @Input) > 0
      BEGIN
            SET @EndIndex = CHARINDEX(@Character, @Input)

            INSERT INTO @Output(Item)
            SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
      END

      RETURN
END
GO


SELECT Item FROM 
dbo.SplitString(@result,',') ORDER BY Item
创建函数拆分字符串
(    
@输入NVARCHAR(最大值),
@字符字符(1)
)
返回@Output表(
项目NVARCHAR(1000)
)
作为
开始
声明@StartIndex INT、@EndIndex INT
设置@StartIndex=1
如果子字符串(@Input,LEN(@Input)-1,LEN(@Input))@字符
开始
设置@Input=@Input+@字符
结束
而CHARINDEX(@Character,@Input)>0
开始
设置@EndIndex=CHARINDEX(@Character,@Input)
插入@Output(项目)
选择子字符串(@Input、@StartIndex、@EndIndex-1)
设置@Input=SUBSTRING(@Input,@EndIndex+1,LEN(@Input))
结束
返回
结束
去
从中选择项目
dbo.SplitString(@result,,')按项排序
更新1

我认为最好的方法是,首先获取完整字符串,然后用逗号将其拆分,然后将其存储在临时表中,然后进行排序,这可能是一个好主意

CREATE FUNCTION SplitString
(    
      @Input NVARCHAR(MAX),
      @Character CHAR(1)
)
RETURNS @Output TABLE (
      Item NVARCHAR(1000)
)
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT

      SET @StartIndex = 1
      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
      BEGIN
            SET @Input = @Input + @Character
      END

      WHILE CHARINDEX(@Character, @Input) > 0
      BEGIN
            SET @EndIndex = CHARINDEX(@Character, @Input)

            INSERT INTO @Output(Item)
            SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
      END

      RETURN
END
GO


SELECT Item FROM 
dbo.SplitString(@result,',') ORDER BY Item
创建函数拆分字符串
(    
@输入NVARCHAR(最大值),
@字符字符(1)
)
返回@Output表(
项目NVARCHAR(1000)
)
作为
开始
声明@StartIndex INT、@EndIndex INT
设置@StartIndex=1
如果子字符串(@Input,LEN(@Input)-1,LEN(@Input))@字符
开始
设置@Input=@Input+@字符
结束
而CHARINDEX(@Character,@Input)>0
开始
设置@EndIndex=CHARINDEX(@Character,@Input)
插入@Output(项目)
选择子字符串(@Input、@StartIndex、@EndIndex-1)
设置@Input=SUBSTRING(@Input,@EndIndex+1,LEN(@Input))
结束
返回
结束
去
从中选择项目
dbo.SplitString(@result,,')按项排序

您存储数据的方式是一种非常糟糕的做法。但是,以下是一个用于培训目的的解决方案:

DECLARE 
   @str1 varchar(30) = 'A1,B1,C1',
   @str2 varchar(30) = 'A2,B2,C2',
   @result varchar(60)

;WITH split as
(
  SELECT t.c.value('.', 'VARCHAR(2000)') x
  FROM (
      SELECT x = CAST('<t>' + 
          REPLACE(@str1 + ',' + @str2, ',', '</t><t>') + '</t>' AS XML)
  ) a
CROSS APPLY x.nodes('/t') t(c)
)
SELECT
  @result =
    STUFF(( 
        SELECT ',' + x
        FROM split
        ORDER BY x
        for xml path(''), type 
          ).value('.', 'varchar(max)'), 1, 1, '')

SELECT @result

您存储数据的方式是非常糟糕的做法。但是,以下是一个用于培训目的的解决方案:

DECLARE 
   @str1 varchar(30) = 'A1,B1,C1',
   @str2 varchar(30) = 'A2,B2,C2',
   @result varchar(60)

;WITH split as
(
  SELECT t.c.value('.', 'VARCHAR(2000)') x
  FROM (
      SELECT x = CAST('<t>' + 
          REPLACE(@str1 + ',' + @str2, ',', '</t><t>') + '</t>' AS XML)
  ) a
CROSS APPLY x.nodes('/t') t(c)
)
SELECT
  @result =
    STUFF(( 
        SELECT ',' + x
        FROM split
        ORDER BY x
        for xml path(''), type 
          ).value('.', 'varchar(max)'), 1, 1, '')

SELECT @result
尝试:

尝试:


set@result=@str1+”,“++@str2
我想要“A1、A2、B1、B2、C1、C2”…你的答案会像“A1、B1、C1、A2、B2、C2”一样,你必须使用一个拆分器函数来实现这一点。Google sql server split Strings向我们展示您迄今为止为此所做的工作…这个问题没有显示任何研究成果。
set@result=@str1+,“++@str2
我想要“A1,A2,B1,B2,C1,C2”…您的答案将显示为“A1,B1,C1,A2,B2,C2”,您必须使用拆分器函数来完成此操作。Google sql server split Strings向我们展示您迄今为止为此所做的工作……这个问题没有显示任何研究成果。我希望完全使用此格式“A1、A2、B1、B2、C1、C2”。我希望完全使用此格式“A1、A2、B1、B2、C1、C2”。@user2695128:欢迎,如果它对您有效,请将其标记为answer@user2695128:欢迎,如果它对您有效,您可以将其标记为答案