【问题标题】:Incorrect syntax near '=' in Exec statementExec 语句中“=”附近的语法不正确
【发布时间】:2019-02-28 14:20:36
【问题描述】:

当我执行此操作时:

declare @INP_ITBL_NM_SQL char (64)
Exec('
    select '+@INP_ITBL_NM_SQL+' = 
            concat(LTRIM(RTRIM(a.db_schema_name)),LTRIM(RTRIM(b.Name)))
            from '+@db_and_schema+' as a, '+@split_itbl+' as b
            where b.ID = 2 and a.libname = (select c.Name from 
            '+@split_itbl+' as c where c.ID = 1)
')

我收到以下错误:

消息 102,级别 15,状态 1,第 2 行 '=' 附近的语法不正确。

select 语句中的变量是临时表,每次运行时(需要)更改其名称。

感谢您的帮助!

【问题讨论】:

  • 将字符串创建为变量,然后执行。
  • 用“print”代替exec,看看是哪一行产生了错误。
  • 查看此堆栈溢出,stackoverflow.com/questions/42417688/dynamic-sql-wont-execute 并遵循批准的解决方案。它将查询字符串构建成一个变量,然后执行它
  • 你真的应该在这里使用正确的连接。您有一个交叉连接,可以有效地变成与其他两个表的内部连接。

标签: sql-server tsql dynamic-sql


【解决方案1】:

您收到该错误是因为您试图将局部变量的值设置为动态 SQL 中的值。因此,当您打印出该 SQL 文本时,它看起来像:

SELECT = concat…

您应该使用 sp_executesql 的输出参数来执行此操作。类似于以下内容:

DECLARE @SQL nvarchar(max)
DECLARE @ParamDef nvarchar(200)
DECLARE @INP_ITBL_NM_SQL varchar(100) = ''

SET @ParamDef = N'@INP_ITBL_NM_SQL_OUTPUT varchar(100) OUTPUT';

SET @SQL = N'select @INP_ITBL_NM_SQL_OUTPUT = concat(LTRIM(RTRIM(a.db_schema_name)),LTRIM(RTRIM(b.Name)))
            from '+ @db_and_schema+ ' as a, ' + @split_itbl +' as b
            where b.ID = 2 and a.libname = (select c.Name from 
            '+ @split_itbl +' as c where c.ID = 1)'

EXEC sp_executesql @SQL, @ParamDef, @INP_ITBL_NM_SQL_OUTPUT=@INP_ITBL_NM_SQL OUTPUT;

SELECT @INP_ITBL_NM_SQL

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2013-12-16
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多