考虑一个包含三个行的名称的数据库表:
Peter
Paul
Mary
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以将其转换为单个字符串Peter, Paul, Mary?
我正在尝试将基于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,所以请错误地说太多的解释:)
想象一下下表(称为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) 我有3个表叫:
我想在GUI上显示所有资源名称的表.在每行的一个单元格中,我想列出该资源的所有应用程序(以逗号分隔).
所以问题是,在SQL中执行此操作的最佳方法是什么,因为我需要获取所有资源,而且还需要获取每个资源的所有应用程序?
我是否首先从资源运行select*然后遍历每个资源并对每个资源执行单独的查询以获取该资源的应用程序列表?
有没有办法在一个查询中执行此操作?
是否可以编写一个从表中选择列并将结果转换为字符串的语句?
理想情况下,我想要逗号分隔值.
例如,假设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"
我在MS SQL Server 2017中观察到了一些奇怪的行为.
+=在select中充当聚合器('连接所有行的值'),当右边是常量时.+=在select中,当右侧是列名时,则表示"只设置值" .(另外,这会改变其他列的聚合行为)所以我的问题是:
@c1结果只包含最后一行的值,即使+=使用了?@c2受到影响,通过改变+=- > =为@c1?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) 我有一个连接查询:
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) 回报
Run Code Online (Sandbox Code Playgroud)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
我的串联查询返回
'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 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)
什么都不返回.我究竟做错了什么?
我正在尝试创建一个连接硬编码字符串和使用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查询串联导致它返回一个空字符串....帮助!
我正在使用一个选择查询和一个变量来连接查询中的一些字符串,如下所示:
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)