【问题标题】:SQL Server script syntax errors and "must declare the scalar value"SQL Server 脚本语法错误和“必须声明标量值”
【发布时间】:2012-12-05 19:26:11
【问题描述】:

我正在尝试用 T-SQL 编写一个脚本来解决我们系统上的一个关键问题。不幸的是,我以前从未这样做过,所以我进入了未知领域。

我实际上正在编写一个 PHP 脚本来生成这个 SQL。如果用户存在,则创建它。但在这两种情况下,都需要将用户添加到组中。

DECLARE @userId AS int

/* --------------- 123l123123fvsdf - Name --------------- */
    BEGIN
        IF EXISTS(SELECT id FROM [CMT_UAT].[dbo].[user] WHERE username = '123l123123fvsdf')
                INSERT INTO [CMT_UAT].[dbo].[user](username, password, email, firstname, lastname, created) VALUES('123l123123fvsdf', 'PASSWORD', 'aa00043@user.com', 'firstName', 'lastName', GETDATE())
                GO
                SET @userId = @@IDENTITY
        ELSE
                SET @userId = SELECT id FROM [CMT_UAT].[dbo].[user] WHERE username = 'AA00043'
    END
    INSERT INTO [CMT_UAT].[dbo].[user_group](user_id, group_id) VALUES(@userId, '7')

我收到以下错误:

消息 102,第 15 级,状态 1,第 7 行
')' 附近的语法不正确。
消息 137,第 15 级,状态 1,第 1 行
必须声明标量变量“@userId”。
消息 156,第 15 级,状态 1,第 3 行
关键字“SELECT”附近的语法不正确。
消息 156,第 15 级,状态 1,第 5 行
关键字“INSERT”附近的语法不正确。
消息 137,第 15 级,状态 2,第 5 行
必须声明标量变量“@userId”。

我已经对标量值进行了一些谷歌搜索,当我的查询返回多行时可能会发生这种情况,我已经验证它没有。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    从脚本中去掉“GO”。 “GO”是一个提供者指令,它告诉连接管理器结束执行批处理并开始一个新的批处理。因此,它会重置您的执行上下文,清除您的 @userid 变量声明。

    【讨论】:

      【解决方案2】:

      你需要修正你的 if 语句。试试:

      DECLARE @userId AS int
      
      IF EXISTS(SELECT id FROM [CMT_UAT].[dbo].[user] WHERE username = '123l123123fvsdf')
      BEGIN
          INSERT INTO [CMT_UAT].[dbo].[user](username, password, email, firstname, lastname, created) VALUES('123l123123fvsdf', 'PASSWORD', 'aa00043@user.com', 'firstName', 'lastName', GETDATE())
          SET @userId = @@IDENTITY
      END
      ELSE
         SET @userId = SELECT id FROM [CMT_UAT].[dbo].[user] WHERE username = 'AA00043'
      
      INSERT INTO [CMT_UAT].[dbo].[user_group](user_id, group_id) VALUES(@userId, '7')
      

      您的 if 块的第一部分中有 multipl 语句,但您忘记在其周围放置 BEGINEND

      还像 RBarryYoung 指出的那样,您需要将GO 拿出来

      【讨论】:

      • 好电话,有帮助。它仍然不喜欢SELECT 附近的语法
      • 知道了,需要在括号内
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多