2017-07-03 70 views
1

我把這個在SQL Server 2008中的SQL查詢編輯器並不起作用:如果不是在SQL EXISTS不起作用

If not EXISTS (Select * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA= 'dbo' AND TABLE_NAME='PK01') 
    CREATE TABLE [dbo].['PK01'] (Articulo varchar(MAX),Referencia varchar(MAX),Lote varchar(MAX),Cantidad Int,Ubicacion varchar(MAX)); 
    INSERT INTO [UBICACIONES].[dbo].['PK01'] (Articulo,Referencia,Lote,Cantidad,Ubicacion)VALUES ('998','kk','ll',0,'pp') 
else 
    UPDATE [UBICACIONES].[dbo].['PK01'] Set Cantidad = (Cantidad + 23) WHERE Articulo LIKE '998'   

錯誤我得到:

消息156,級別15,狀態1,行4關鍵字 'else'附近的語法不正確。

+4

可能的重複[SQL Server 2008 - IF NOT EXISTS INSERT ELSE UPDATE](https://stackoverflow.com/questions/11906506/sql-server-2008-if-not-exists-insert-else-update) – mrogers

+1

@ mrogers不,它不是。 MERGE對這個問題不是一個合適的答案。 –

回答

2

您的if語句僅作用於IF後面的第一個語句,除非您在語句周圍放置BEGIN/END。這就是我喜歡在一個陳述IFs周圍有BEGIN/END的原因。

If not EXISTS (Select * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA= 'dbo' AND TABLE_NAME='PK01') 
BEGIN 
    CREATE TABLE [dbo].['PK01'] (Articulo varchar(MAX),Referencia varchar(MAX),Lote varchar(MAX),Cantidad Int,Ubicacion varchar(MAX)); 
    INSERT INTO [UBICACIONES].[dbo].['PK01'] (Articulo,Referencia,Lote,Cantidad,Ubicacion)VALUES ('998','kk','ll',0,'pp') 
END 
ELSE 
BEGIN 
    UPDATE [UBICACIONES].[dbo].['PK01'] Set Cantidad = (Cantidad + 23) WHERE Articulo LIKE '998'   
END 
+0

感謝您的回答,但是當我第一次執行查詢時,它會創建一個名爲PK01的表,並在插入具有查詢中所述值的行之後。但是,當我執行第二個查詢時,sql server會將以下消息放在「 」數據庫中已有一個名爲''PK01'的對象。 「並沒有執行else語句。 – panki

+2

@panki這是因爲這個創建的表將在名稱中包含單引號,'['PK01']'不應該有任何引號。 –

0

這是非常不理想的。在使用它們之前,你應該真的創建表格。但是,您可以使用動態SQL來執行此操作:

DECLARE @sql NVARCHAR(MAX); 

If not EXISTS (Select * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'PK01') 
BEGIN 
    SET @sql = 'CREATE TABLE [dbo].[''PK01''] (Articulo varchar(MAX),Referencia varchar(MAX),Lote varchar(MAX),Cantidad Int,Ubicacion varchar(MAX))'; 
    EXEC sp_executesql @sql; 

    SET @sql = ' 
    INSERT INTO [UBICACIONES].[dbo].[''PK01''] (Articulo,Referencia,Lote,Cantidad,Ubicacion)VALUES (''998'',''kk'',''ll'',0,''pp'')'; 
    EXEC sp_executesql @sql; 
END; 
else 
BEGIN 
    SET @sql = ' 
    UPDATE [UBICACIONES].[dbo].[''PK01''] Set Cantidad = (Cantidad + 23) WHERE Articulo LIKE ''998'' ' ; 

    EXEC sp_executesql @sql;  
END; 

完成所有這些後,我會重複一遍。這似乎是一個非常糟糕的應用程序設計。