SQL Server脚本语法错误和"必须声明标量值"

时间:2012-12-05 19:26:11

标签: sql-server

我正在尝试用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')

我收到了这些错误:

  

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

我已经对标量值进行了一些Google搜索,当我的查询返回多行时会发生这种情况,我已经确认它没有。

2 个答案:

答案 0 :(得分:5)

从脚本中取出“GO”。 “GO”是一个提供者指令,它告诉连接管理器结束执行批处理并启动一个新批处理。因此,它正在重置您的执行上下文,消灭您的@userid变量声明。

答案 1 :(得分:3)

你需要修复你的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块的第一部分中有多个语句,但是你忘了在它周围添加BEGINEND

而且像RBarryYoung指出你需要把GO拿出来