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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 如何获得&引用;而不是",;及;在SQL Server中的行中_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 如何获得&引用;而不是",;及;在SQL Server中的行中

Sql server 如何获得&引用;而不是",;及;在SQL Server中的行中,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个1列的表测试 Module_name Table Computer Laptop Chair 我的预期产出: Table,Computer,Laptop and Chair 我的问题是: declare @module_name varchar(50) SELECT @Module_Name = COALESCE(@Module_Name + ' and ', '') + module_name FROM (SELECT DISTINCT module_na

我有一个1列的表测试

Module_name

Table  
Computer  
Laptop  
Chair  
我的预期产出:

Table,Computer,Laptop and Chair
我的问题是:

declare @module_name varchar(50)
SELECT @Module_Name = COALESCE(@Module_Name + ' and ', '') + module_name FROM
    (SELECT DISTINCT module_name FROM Test) T       
    select @module_name
我得到的输出为:

Table and Computer and Laptop and Chair
我关心的是如何获得“,”而不是“,”

您是否使用
stuff()函数尝试过xml方法

declare @Module_names varchar(max)

set @Module_names = stuff((select distinct ',' +Module_name 
                           from table t
                           for xml path('')),1,1, '')  
select REVERSE(STUFF(REVERSE(@Module_names),                
                    CHARINDEX(',', REVERSE(@Module_names)), 1,' dna ')) as Module_names
您是否使用
stuff()
函数尝试过xml方法

declare @Module_names varchar(max)

set @Module_names = stuff((select distinct ',' +Module_name 
                           from table t
                           for xml path('')),1,1, '')  
select REVERSE(STUFF(REVERSE(@Module_names),                
                    CHARINDEX(',', REVERSE(@Module_names)), 1,' dna ')) as Module_names

我不赞成这种解决方案,正如我在评论中所说,语法化应该在您的表示层中完成。。但是,您可以在SQL中实现这一点,如下所示:

编辑:轻微更新以满足单值返回


我不赞成这种解决方案,正如我在评论中所说,语法化应该在您的表示层中完成。。但是,您可以在SQL中实现这一点,如下所示:

编辑:轻微更新以满足单值返回


使用以下命令。首先用逗号收集所有记录,然后用“and”替换最后一个记录。必须确保您的列值不包含逗号,否则上次出现时会错放“and”

DECLARE @result VARCHAR(MAX) = STUFF(
    (
        SELECT DISTINCT
            ', ' + T.module_name
        FROM
            Test AS T
        FOR XML
            PATH('')
    ),
    1, 2, '')


SET @result = 
    REVERSE(
        STUFF(                                  -- Replace
            REVERSE(@result),                   -- ... in the reversed string
            CHARINDEX(',', REVERSE(@result)),   -- ... at the first position of the comma (the last one on the original string)
            1,                                  -- just 1 character (the comma)
            'dna ')                             -- for the reversed " and"
        )

SELECT @result

使用以下命令。首先用逗号收集所有记录,然后用“and”替换最后一个记录。必须确保您的列值不包含逗号,否则上次出现时会错放“and”

DECLARE @result VARCHAR(MAX) = STUFF(
    (
        SELECT DISTINCT
            ', ' + T.module_name
        FROM
            Test AS T
        FOR XML
            PATH('')
    ),
    1, 2, '')


SET @result = 
    REVERSE(
        STUFF(                                  -- Replace
            REVERSE(@result),                   -- ... in the reversed string
            CHARINDEX(',', REVERSE(@result)),   -- ... at the first position of the comma (the last one on the original string)
            1,                                  -- just 1 character (the comma)
            'dna ')                             -- for the reversed " and"
        )

SELECT @result

使用行号捕获最后一行

CREATE TABLE test
    ([Module_name] varchar(8))
;

INSERT INTO test
    ([Module_name])
VALUES
    ('Table'),
    ('Computer'),
    ('Laptop'),
    ('Chair')
;

 SELECT STUFF((SELECT CASE WHEN RN = MAX(RN) OVER () THEN ' and ' ELSE ', ' END + Module_name
    from 
    (

        SELECT Module_name,
               ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN 
        FROM test
    ) rns

    ORDER BY RN
    FOR XML PATH('')),1,2,'');

使用行号捕获最后一行

CREATE TABLE test
    ([Module_name] varchar(8))
;

INSERT INTO test
    ([Module_name])
VALUES
    ('Table'),
    ('Computer'),
    ('Laptop'),
    ('Chair')
;

 SELECT STUFF((SELECT CASE WHEN RN = MAX(RN) OVER () THEN ' and ' ELSE ', ' END + Module_name
    from 
    (

        SELECT Module_name,
               ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN 
        FROM test
    ) rns

    ORDER BY RN
    FOR XML PATH('')),1,2,'');

“语法化”应该在您的表示层中完成,而不是通过数据引擎。虽然有一种很糟糕的方法可以修改您当前的代码以生成您想要的输出,但请注意,您当前的技术是:“不要在SELECT语句中使用变量来连接值(…)。可能会出现意外的查询结果。这是因为选择列表(…)中的所有表达式不能保证对每个输出行执行一次。“语法化”应该在表示层中完成,而不是由数据引擎完成。尽管修改当前代码可能会有一种令人讨厌的方法来生成您要查找的输出,请注意,您当前的技术是:“不要在SELECT语句中使用变量连接值(…)。可能会出现意外的查询结果。这是因为SELECT列表(…)中的所有表达式不能保证对每个输出行执行一次”那么这将如何给出所需的输出呢?我相信他希望值用逗号分隔,直到最后一个,应该是“And”。我同意,这是一种比讨厌的自引用变量好得多的技术,然而,OP希望倒数第二个和最后一个值之间有
”和“
”;它不是一个简单的分隔列表。他们希望“Grammarise”数据,而不是对其进行分隔。它是逗号分隔的输出,没有And。它仍然给我一个错误。Msg 189,15级,状态1,第6行charindex函数需要2到3个参数。这将如何给出所需的输出?我相信他希望在最后一个值之前用逗号分隔,应该是“And”“。我同意,这是一种比讨厌的自引用变量好得多的技术,但是,OP希望在倒数第二个和最后一个值之间有
”和“
”;它不是一个简单的分隔列表。他们想要“Grammarise”数据,而不是对其进行分隔。它是逗号分隔的输出,没有And。它仍然给我一个错误。Msg 189,15级,状态1,第6行charindex函数需要2到3个参数。