相关疑难解决方法(0)

如何将多行中的文本连接成SQL Server中的单个文本字符串?

考虑一个包含三个行的名称的数据库表:

Peter
Paul
Mary
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以将其转换为单个字符串Peter, Paul, Mary

sql sql-server csv string-concatenation group-concat

1813
推荐指数
33
解决办法
222万
查看次数

在Microsoft SQL Server 2005中模拟group_concat MySQL函数?

我正在尝试将基于MySQL的应用程序迁移到Microsoft SQL Server 2005(不是选择,而是生活).

在原始应用程序中,我们几乎完全使用符合ANSI-SQL的语句,但有一个重要的例外 - 我们group_concat经常使用MySQL的函数.

group_concat顺便说一下,这样做:给出一张表,比如说,员工姓名和项目......

SELECT empName, projID FROM project_members;
Run Code Online (Sandbox Code Playgroud)

收益:

ANDY   |  A100
ANDY   |  B391
ANDY   |  X010
TOM    |  A100
TOM    |  A510
Run Code Online (Sandbox Code Playgroud)

...这是你用group_concat得到的:

SELECT 
    empName, group_concat(projID SEPARATOR ' / ') 
FROM 
    project_members 
GROUP BY 
    empName;
Run Code Online (Sandbox Code Playgroud)

收益:

ANDY   |  A100 / B391 / X010
TOM    |  A100 / A510
Run Code Online (Sandbox Code Playgroud)

所以我想知道的是:是否有可能在SQL Server中编写用户定义的函数来模拟其功能group_concat

我几乎没有使用UDF,存储过程或类似的东西的经验,只是直接的SQL,所以请错误地说太多的解释:)

sql sql-server sql-server-2005 string-aggregation

342
推荐指数
9
解决办法
17万
查看次数

计算SQL Server中的运行总计

想象一下下表(称为TestTable):

id     somedate    somevalue
--     --------    ---------
45     01/Jan/09   3
23     08/Jan/09   5
12     02/Feb/09   0
77     14/Feb/09   7
39     20/Feb/09   34
33     02/Mar/09   6
Run Code Online (Sandbox Code Playgroud)

我想要一个以日期顺序返回运行总计的查询,例如:

id     somedate    somevalue  runningtotal
--     --------    ---------  ------------
45     01/Jan/09   3          3
23     08/Jan/09   5          8
12     02/Feb/09   0          8
77     14/Feb/09   7          15  
39     20/Feb/09   34         49
33     02/Mar/09   6          55
Run Code Online (Sandbox Code Playgroud)

我知道在SQL Server 2000/2005/2008中有各种方法可以做到这一点.

我对使用aggregate-set-statement技巧的这种方法特别感兴趣:

INSERT INTO @AnotherTbl(id, somedate, somevalue, runningtotal) 
   SELECT id, somedate, somevalue, null
   FROM TestTable
   ORDER …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server running-total

158
推荐指数
8
解决办法
23万
查看次数

如何使用SQL查询创建逗号分隔列表?

我有3个表叫:

  • 应用程序(id,name)
  • 资源(id,name)
  • ApplicationsResources(id,app_id,resource_id)

我想在GUI上显示所有资源名称的表.在每行的一个单元格中,我想列出该资源的所有应用程序(以逗号分隔).

所以问题是,在SQL中执行此操作的最佳方法是什么,因为我需要获取所有资源,而且还需要获取每个资源的所有应用程序?

我是否首先从资源运行select*然后遍历每个资源并对每个资源执行单独的查询以获取该资源的应用程序列表?

有没有办法在一个查询中执行此操作?

sql t-sql sql-server string-aggregation

53
推荐指数
6
解决办法
15万
查看次数

SQL Server转换选择一个列并将其转换为字符串

是否可以编写一个从表中选择列并将结果转换为字符串的语句?

理想情况下,我想要逗号分隔值.

例如,假设SELECT语句看起来像

SELECT column
FROM table
WHERE column<10
Run Code Online (Sandbox Code Playgroud)

结果是一个包含值的列

|column|
--------
|  1   |
|  3   |
|  5   |
|  9   |
Run Code Online (Sandbox Code Playgroud)

我希望结果是字符串"1,3,5,9"

sql sql-server string select

21
推荐指数
5
解决办法
9万
查看次数

+ =在SELECT子句中; 常数vs列

我在MS SQL Server 2017中观察到了一些奇怪的行为.

  • +=在select中充当聚合器('连接所有行的值'),当右边是常量时.
  • +=在select中,当右侧是列名时,则表示"只设置值" .(另外,这会改变其他列的聚合行为)

所以我的问题是:

  1. 为什么@c1结果只包含最后一行的值,即使+=使用了?
  2. 为什么@c2受到影响,通过改变+=- > =@c1

版本1:

BEGIN
    DECLARE
        @c1 NVARCHAR(MAX) = N'',
        @c2 NVARCHAR(MAX) = N'';

    SELECT
        @c1 = constraint_name, -- version-1
        @c2 += '+'
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
    ORDER BY 1 DESC
    ;

    PRINT '@c1=' + @c1;
    PRINT '@c2=' + @c2;
END
;
Run Code Online (Sandbox Code Playgroud)

版本1结果:

@c1 = fk_abcde
@c2 = ++++++++++++++++++++++++++++++++++++++++++
(`@c2` result is aggregation of many rows; …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2017

9
推荐指数
1
解决办法
116
查看次数

VARCHAR(MAX)在连接字符串时表现得很奇怪

我有一个连接查询:

DECLARE @path NVARCHAR(max) 
SELECT @path = ISNULL(@path + '/', '') + url_segment 
    FROM navigation_self_and_parents(2813) ORDER BY depth ASC
SELECT @path
Run Code Online (Sandbox Code Playgroud)

navigation_self_and_parents(2813) 回报

id    par_id  title        url_segment    sequence        depth
2813  2816    testing1234  testing1234    0               0   
2816  2809    U            /fixedurl      0               -1   
2809  NULL    E            E              0               -2   
Run Code Online (Sandbox Code Playgroud)

我的串联查询返回

'testing1234'             when using `NVARCHAR(MAX)` and
'E//fixedurl/testing1234' when using `NVARCHAR(4000)`

我最好的猜测是使用NVARCHAR(MAX)原因@path每次设置都要重新输入,因此在重新输入之前丢失了设置的内容,或者在第一次设置时输入,然后后续连接调用无声地失败.

我很想真正理解这种行为的根本原因.

UPDATE

navigation_self_and_parents:

USE [SomeDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[navigation_self_and_parents]
(   
    @id int …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server-2005

7
推荐指数
1
解决办法
1238
查看次数

将sql值连接到变量

在SQL Server 2008上,我试图将所有选定值的逗号分隔列表添加到变量中.

SELECT field
FROM table
Run Code Online (Sandbox Code Playgroud)

收益:

+-------+
| field |
+-------+
| foo   |
+-------+
| bar   |
+-------+
Run Code Online (Sandbox Code Playgroud)

我想得到:"foo,bar,"

我试过了:

DECLARE @foo NVARCHAR(MAX)
SET @foo = ''

SELECT @foo = @foo + field + ','
FROM TABLE

PRINT @foo
Run Code Online (Sandbox Code Playgroud)

什么都不返回.我究竟做错了什么?

sql sql-server sql-server-2008

7
推荐指数
1
解决办法
3万
查看次数

FOR XML PATH和字符串连接

我正在尝试创建一个连接硬编码字符串和使用FOR XML PATH创建的字符串的值.

SUBSTRING(
(SELECT (', ' + [value]) 
 FROM [values]
 FOR XML PATH( '' )
), 3, 1000) +
' text in between my values ' +
SUBSTRING(
(SELECT (', ' + [otherValue]) 
 FROM [otherValues]
 FOR XML PATH( '' )
), 3, 1000)
Run Code Online (Sandbox Code Playgroud)

所以我希望有类似的东西:Value1, Value2, Value3 text in between my values OtherValue1, OtherValue2, OtherValue3但是我得到一个空字符串.

如果我取出子串(包括其中的查询),我得到的值介于罚款之间,如果我只自己添加一个子串块,我就会得到列表字符串.所以我无法解决为什么与子字符串和FOR XML PATH查询串联导致它返回一个空字符串....帮助!

sql t-sql sql-server-2008

6
推荐指数
1
解决办法
1万
查看次数

连接SELECT查询的结果只返回一个值

我正在使用一个选择查询和一个变量来连接查询中的一些字符串,如下所示:

DECLARE @sConcat nvarchar(max)
SET @sConcat = ''
SELECT @sConcat = @sConcat + '[' + SomeColumn + ']'
 FROM SomeTable
 ORDER BY SomeColumn
Run Code Online (Sandbox Code Playgroud)

在我的特殊情况下,我将FROM子句更改为派生表,它只是将整数列强制转换为 nvarchar,这样我就不必每次在串联中出现时都将其强制转换。

进行此更改后,连接的结果只是 table 中的一个值。将 CAST 移动到外部查询时,或删除ORDER BY子句时,结果符合预期。

这一切都可以用下面的 t-sql 来重现。

BEGIN TRAN

-- Create a dummy table and populate it with some values
CREATE TABLE TTest (
    TTest_ID int IDENTITY(1,1) NOT NULL,
    TTest_Text varchar(8) NOT NULL
 CONSTRAINT PK_TTest PRIMARY KEY CLUSTERED (
    TTest_Id ASC
 )
) ON [PRIMARY]

INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server stored-procedures

5
推荐指数
1
解决办法
2764
查看次数