簡體   English   中英

條件選擇語句,如果不是

[英]Conditional Select Statement with if else

我試圖從一行中選擇數據,然后使用該值將另一個預定義的數據值輸入到變量中。 我已經知道了,但是不確定這是否是SQL的正確語法。

DECLARE @ID INT
DECLARE @server VARCHAR(15)

DECLARE response_cursor CURSOR
    FOR SELECT col1, col3, col4 FROM [dbo].[tbl] WHERE [status] <> 'Decommission'

IF col3 ='ABCD'
    THEN @server = 'Server1';
ELSIF col3 ='DEFS'
    THEN @server = 'Server2';
ELSIF col3 ='THSE'
    THEN @server = 'Server3';
...
ELSE col3 = NULL
    THEN @server = Null
END IF;

當我嘗試運行它時,我得到了這個:

消息156,級別15,狀態1,行9關鍵字'then'附近的語法錯誤。

這是在MS SQL 2012服務器上運行

這是我正在處理的整個sql語句; 可能有助於更好地解釋我要做什么。

USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[sp_anotherprocedure]

as
begin


-- begin loop processing to get a response for each record in the validation     table

DECLARE @ID INT
DECLARE @server varchar(15)
DECLARE @port nvarchar(5)

declare response_cursor cursor
    for select ID, COL3, Assigned_Port  from [dbo].[tbl] where [Status] <>     'Decommission' -- we dont want to process decommissioned ports

    if COL3='123'
        begin @server = 'ABC'; end
    IF COL3='456'
        begin @server = 'DEF'; end
    IF COL3='789'
        begin @server = 'HIJ'; end
    ELSE COL3 = NULL
        begin @server = '' END


open response_cursor
fetch next from response_cursor  -- get the first record
INTO @ID, @SERVER, @PORT

WHILE @@FETCH_STATUS = 0
BEGIN
    -- make the  call
    DECLARE @RC int
    DECLARE @request nvarchar(100)
    DECLARE @out nvarchar(max)

   --set @server = 'xxx.xxx.xxx.xxx'   --ip address of the server
   --set @port = '101010'               --port of the server
   set @request = '"some_parmamet'  

    EXECUTE @RC = [dbo].[sp_stored] 
        @server
        ,@port
        ,@request
        ,@out output

    -- UPDATE THE RESPONSE FIELD FOR THE CURRENT RECORD WITH THE RESPONSE     FROM THE REQUEST
/*   UPDATE [dbo].[tbl]
        set response = @out
        where ID = @ID

    fetch next from response_cursor  -- get the next record and repeat  request
    into @ID, @SERVER, @PORT
*/
    Print @out
    END 

close response_cursor
deallocate response_cursor


end

這里有一些問題:

DECLARE @ID INT
DECLARE @server VARCHAR(15)

DECLARE response_cursor CURSOR
    FOR SELECT col1, col3, col4 FROM [dbo].[tbl] WHERE [status] <> 'Decommission'

對於你的第一個

IF col3 ='ABCD'
    BEGIN SET @server = 'Server1'; END

我知道沒有ELSE / IF IN SQL。

IF col3 ='DEFS'
    BEGIN SET @server = 'Server2'; END

IF col3 ='THSE'
    BEGIN SET @server = 'Server3'; END

Yuu不需要END IF。 您為每個IF進行BEGIN / END。 另外,如果需要,您可以使用ELSE

結構是

IF something BEGIN dosomething END
ELSE
BEGIN doSomethingElse END

如果您確實需要使用IF / THEN / ELSE模型,則可以始終使用CASE進行操作

該結構是

SELECT CASE WHEN someCritera then dosomething
WHEN someCriteria then doSomething
...
--after your final when/then end with an END

供參考

您可以使用CASE語句來獲得更簡潔的代碼。

SELECT @server = (
  CASE col3
    WHEN '123' THEN 'ABC'
    WHEN '456' THEN 'DEF'
    WHEN '789' THEN 'GHI'
    ELSE ''
  END)
CASE
    WHEN col3 = 'ABCD' THEN 'Server1'
    WHEN col3 = 'DEFS' THEN 'Server2'
    WHEN col3 = 'THSE' THEN 'Server3'
ELSE NULL END as @server

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM