【问题标题】:Dynamic SQL - Concatenated FROM table动态 SQL - 连接 FROM 表
【发布时间】:2013-04-02 17:16:18
【问题描述】:

长期搜索者第一次发帖。

我正在尝试创建一个动态 SQL 脚本,它将动态部分连接成一个字符串以形成 From 子句,因此我只能声明一次表名(将来我将添加到这个脚本中,以便循环整个一堆表)。但是,当我运行脚本时,我收到错误:'+' 附近的语法不正确

DECLARE @SCode varchar(4)
DECLARE @Subcode varchar(4)

SET @SCode = 'Client1'
SET @Subcode = 'A'          
SELECT MAX(dateofchange) AS Maxdate, @SCode + 'Type'.ID 
FROM @SCode + 'Type'

任何帮助将不胜感激。我相信答案会很简单,但是我对 SQL 游戏还是比较陌生。

谢谢,SSMS - 2005

【问题讨论】:

  • 哪个+?删除@SCode +'Type'.ID 并查看它运行
  • 它是 From 中的 +,因为我将代码一直剥离回只是一个简单的 select top 1 * from 并且它错误。不过谢谢你的建议。

标签: sql tsql sql-server-2005 dynamic ssms


【解决方案1】:

在 SQl Server 2005 中使用 Alexander Fedorenko 的答案会给出错误“无法将默认值分配给局部变量”。然后对于每个变量“必须声明标量变量“@dml””

这样做的原因是,在 2005 中,您必须声明变量并设置为 like

DECLARE @SCode AS VARCHAR(MAX)
SET @scode ='ID12'

我简化了示例 a 但是下面的代码是 SSMS 2005 的工作示例

DECLARE @dml  as NVARCHAR(MAX)
DECLARE @SCode AS VARCHAR(MAX)
SET @scode ='ID12'
Set @dml='SELECT ID 
FROM '+ QUOTENAME(+@SCode +'Type')
EXEC sp_executesql @dml

旁注:为什么你不能用代码块评论答案,这超出了我的理解。

【讨论】:

  • 非常有价值的信息。感谢@Richard 并在您的回答中 +1;)
  • 谢谢,现在我有足够的代表可以加 1 你的答案了。
【解决方案2】:

试试这个动态 SQL 脚本(SQLServer2008+ 的选项)

DECLARE @SCode varchar(10) = 'Client1',
        @Subcode varchar(10) = 'A',
        @dml nvarchar(400)
SELECT @dml = 'SELECT MAX(dateofchange) AS Maxdate, ID FROM ' + QUOTENAME( + @SCode + 'Type')
EXEC sp_executesql @dml

【讨论】:

  • 请在下面查看我的附加答案以获取工作代码以及为什么需要进行这些更改的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多