【问题标题】:T-SQL, Select @variable within a sub-query causes syntax errorT-SQL,在子查询中选择 @variable 会导致语法错误
【发布时间】:2010-12-10 16:32:52
【问题描述】:

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

当我单独运行子查询时,它可以工作,但是一旦我将它用作子查询,由于语法错误,它不再工作。

以下代码导致语法错误

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

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

返回“看门人”

所以我想说

看门人 |查理约翰雅各布

2 个字段,1 条记录。

【问题讨论】:

  • 你想做什么,用简单的英语?
  • 您是在尝试将行转换为列,还是在 firstName 中添加空格
  • 看起来像是试图将所有名字连接到一个结果集中......但是为什么呢?如果可行,这将创建各种名字金字塔。这里的意图非常值得怀疑。

标签: sql sql-server tsql


【解决方案1】:

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

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

这至少可以解决一件事,尽管我不确定 SQL Server 对像这样连接内联的感觉如何。如果您的表相当大,您也有溢出 varchar(1000) 的风险。即使是 varchar 8000 也不是很适合这种查询。

【讨论】:

  • 你好,我刚试过,没用,同样的错误。声明 @test varchar(1000) set @test = '' SELECT description, (SELECT @test = @test + FirstName FROM EMP_tblEmployee ) 作为来自 EMP_tblCrew 的测试
  • 如果您真的想连接名称,您可能会考虑使用光标或某些 CTE 函数。请说明您想要达到的目标。更好的是,模拟一个你想要的结果集。
  • 您的评论查询中缺少 FROM 子句。
  • 对不起,这是一个复制粘贴问题(在此处发布时取出了数据库名称)。
  • 更新了查询以使用 FOR XML PATH('') 进行连接。请注意,不再需要该变量。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

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

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

另一种方法是创建一个用户定义的函数,该函数从 EMP_tblEmployee 表中返回串联的值。你可以在 2005 年或 2008 年做到这一点。

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多