Sql 带if-else的条件Select语句

Sql 带if-else的条件Select语句,sql,sql-server-2012,Sql,Sql Server 2012,我试图从一行中选择数据,然后使用该值将另一个预定义的数据值输入到变量中。我知道了,但不确定它是否是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 @s

我试图从一行中选择数据,然后使用该值将另一个预定义的数据值输入到变量中。我知道了,但不确定它是否是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;
当我尝试运行它时,会得到以下结果:

Msg 156,15级,状态1,第9行关键字附近语法不正确 “那么”

这是在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'
SQL中没有我知道的其他/IF

你不需要结束,如果。为每个IF执行开始/结束。此外,如果您需要这样做,您可以使用其他

结构是

IF something BEGIN dosomething END
ELSE
BEGIN doSomethingElse END
SELECT CASE WHEN someCritera then dosomething
WHEN someCriteria then doSomething
...
--after your final when/then end with an END
如果您真的需要使用If/THEN/ELSE模型,您可以使用CASE

这个结构是

IF something BEGIN dosomething END
ELSE
BEGIN doSomethingElse END
SELECT CASE WHEN someCritera then dosomething
WHEN someCriteria then doSomething
...
--after your final when/then end with an END

这里有几个问题:

DECLARE @ID INT
DECLARE @server VARCHAR(15)

DECLARE response_cursor CURSOR
    FOR SELECT col1, col3, col4 FROM [dbo].[tbl] WHERE [status] <> 'Decommission'
SQL中没有我知道的其他/IF

你不需要结束,如果。为每个IF执行开始/结束。此外,如果您需要这样做,您可以使用其他

结构是

IF something BEGIN dosomething END
ELSE
BEGIN doSomethingElse END
SELECT CASE WHEN someCritera then dosomething
WHEN someCriteria then doSomething
...
--after your final when/then end with an END
如果您真的需要使用If/THEN/ELSE模型,您可以使用CASE

这个结构是

IF something BEGIN dosomething END
ELSE
BEGIN doSomethingElse END
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语句来获得更清晰的代码

SELECT @server = (
  CASE col3
    WHEN '123' THEN 'ABC'
    WHEN '456' THEN 'DEF'
    WHEN '789' THEN 'GHI'
    ELSE ''
  END)

然后更改为设置为初学者。您不需要读取光标吗?@jarlh很好。我甚至没有去他们那里,因为这个问题是关于“如果/然后改变”的。你不需要阅读光标吗?@jarlh很好。我甚至没有去他们那里,因为这个问题与if/then有关,我尝试使用if/begin语法,但是每一行都是错误的。实际上,我需要做的是从表中获取数据,并将其与我正在构建的数组进行比较,这样我就可以循环,然后将结果输出到另一个表。错误是'@server'ohhhh use SET@server='XXX'附近的语法不正确看起来更接近正确,我总共有8条IF语句,然后是ELSE语句。前两条IF语句通过了SQL中的错误检查,但是下面的6条语句加上ELSE语句在IF预期的对话附近说了不正确的语法-不要紧,我需要从SET语句中删除结尾现在来找出COL3显示为无效列名的原因。我认为这是语法问题,必须等到星期一。尝试使用if/begin语法,但每一行都是错误的。实际上,我需要做的是从表中获取数据,并将其与我正在构建的数组进行比较,这样我就可以循环,然后将结果输出到另一个表。错误是'@server'ohhhh use SET@server='XXX'附近的语法不正确看起来更接近正确,我总共有8条IF语句,然后是ELSE语句。前两条IF语句通过了SQL中的错误检查,但是下面的6条语句加上ELSE语句在IF预期的对话附近说了不正确的语法-不要紧,我需要从SET语句中删除结尾现在来找出COL3显示为无效列名的原因。我认为这是语法问题,必须等到星期一。