2012-12-05 75 views
2

我試圖在T-SQL中編寫腳本來解決我們系統上的關鍵問題。不幸的是,我從來沒有這樣做過,所以我進入了未知的水域。SQL Server腳本語法錯誤和「必須聲明標量值」

我實際上正在編寫一個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', '[email protected]', '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」。
Msg 156,Level 15,State 1,Line 3
關鍵字'SELECT'附近的語法不正確。
Msg 156,Level 15,State 1,Line 5
關鍵字'INSERT'附近的語法不正確。
Msg 137,Level 15,State 2,Line 5
必須聲明標量變量「@userId」。

我已經做了一些關於標量值的搜索,它可以發生在我的查詢返回多行時,我已經驗證它沒有。

回答

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', '[email protected]', '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') 

你有你的,如果塊的第一部分含多處聲明,但你忘了把BEGINEND周圍

而且還喜歡RBarryYoung指出,需要採取GO

+0

良好的通話,這有幫助。它仍然不喜歡'SELECT'附近的語法 – Webnet

+1

明白了,需要在括號內 – Webnet

5

從腳本中取出「GO」。 「GO」是一條提供程序指令,它告訴連接管理器結束執行批處理並啓動一個新的執行批處理。因此,它將重置您的執行上下文,消除您的變量聲明。

相關問題