T-SQL,在子查询中选择@variable会导致语法错误

时间:2010-12-10 16:32:52

标签: sql sql-server tsql

我正在使用子查询来获取所需的结果(返回多个记录),我想将这些结果放在返回的单个记录中。

当我自己运行子查询时,它可以工作,但是一旦我将它用作子查询,它就会因语法错误而无法工作。

以下代码导致语法错误

  

('='附近的语法不正确。)

declare @test varchar(1000)
set @test = ''  

SELECT description, (SELECT @test = @test + FirstName
                FROM EMP_tblEmployee
                )select @test
FROM EMP_tblCrew

基本上,子查询

(SELECT @test = @test + FirstName
                    FROM EMP_tblEmployee
                    )select @test

返回“charliejohnjacob”

主要查询

SELECT description FROM EMP_tblCrew

返回“janitor”

所以我想要它说

  

看门人| charliejohnjacob

2个字段,1个记录。

3 个答案:

答案 0 :(得分:1)

您的查询在语法上并不正确,并且T-SQL解析器有一种令人不快的习惯,即有时不能非常准确地报告错误。这在黑暗中有点刺,但尝试:

SELECT 
description, 
(SELECT FirstName + ' ' FROM EMP_tblEmployee FOR XML PATH('')) AS [Name Concat Result]
FROM EMP_tblCrew

这至少会解决一件事,虽然我不确定SQL服务器对内联这样的连接感觉如何。如果您的表具有可观的大小,您还可能会溢出varchar(1000)。甚至varchar 8000也不是很适合这种查询。

答案 1 :(得分:1)

尝试搜索谷歌“SQL将行连接成字符串”。有许多有用的解决方案。

看起来您还需要将员工加入船员工作台,这样您就不会得到一些笛卡尔产品(通常不是想要的产品)。

答案 2 :(得分:0)

可能最简单的路径涉及使用递归CTE(公用表表达式)。一个详细的例子是https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

注意,这基本上要求你有sql 2008.

另一条路径是创建一个用户定义的函数,该函数返回EMP_tblEmployee表中的连接值。你可以在2005年或2008年这样做。