And*_*eas 5 t-sql sql-server stored-procedures
我正在使用一个选择查询和一个变量来连接查询中的一些字符串,如下所示:
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 TTest (TTest_Text) VALUES ('A')
INSERT INTO TTest (TTest_Text) VALUES ('B')
INSERT INTO TTest (TTest_Text) VALUES ('C')
INSERT INTO TTest (TTest_Text) VALUES ('D')
INSERT INTO TTest (TTest_Text) VALUES ('E')
INSERT INTO TTest (TTest_Text) VALUES ('F')
INSERT INTO TTest (TTest_Text) VALUES ('G')
INSERT INTO TTest (TTest_Text) VALUES ('H')
-- Create a string with the ID values of each row in brackets
DECLARE @sConcat nvarchar(max)
-- First attempt, produces the result '[8]' which is not what I expected
SET @sConcat = ''
SELECT @sConcat = @sConcat + '[' + TTest_ID + ']'
FROM (SELECT CAST(TTest_ID AS nvarchar(100)) AS TTest_ID, TTest_Text
FROM TTest) TTestBis
ORDER BY TTestBis.TTest_ID ASC
PRINT @sConcat
-- Second attempt, with cast in the outer query,
-- produces the expected result '[1][2][3][4][5][6][7][8]'
SET @sConcat = ''
SELECT @sConcat = @sConcat + '[' + CAST(TTest_ID AS nvarchar(100)) + ']'
FROM (SELECT TTest_ID, TTest_Text
FROM TTest) TTestBis
ORDER BY TTestBis.TTest_ID ASC
PRINT @sConcat
-- Third attempt, same as first but without ORDER BY,
-- also produces the expected result '[1][2][3][4][5][6][7][8]'
SET @sConcat = ''
SELECT @sConcat = @sConcat + '[' + TTest_ID + ']'
FROM (SELECT CAST(TTest_ID AS nvarchar(100)) AS TTest_ID, TTest_Text
FROM TTest) TTestBis
PRINT @sConcat
ROLLBACK
Run Code Online (Sandbox Code Playgroud)
为什么 SQL Server 会这样?对我来说这没有意义。我在 SQL Server 2005、2008 和 2008R2 上复制了这个。
编辑
这个问题确实是重复的。迄今为止给出的最佳答案似乎是 Martin Smith在这个问题中的答案。所以你可以投票关闭。
这个问题确实是重复的。可以在以下 stackoverflow 问题中找到全面的答案:nvarchar concatenation / index / nvarchar(max) inexplained behavior。
本文提供了针对 SELECT 查询中连接字符串问题的几种有效解决方案:https: //www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql /
归档时间: |
|
查看次数: |
2764 次 |
最近记录: |