Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T如果列存在,则为SQL(如果它的值为X,则为(_Sql Server_Tsql - Fatal编程技术网

Sql server T如果列存在,则为SQL(如果它的值为X,则为(

Sql server T如果列存在,则为SQL(如果它的值为X,则为(,sql-server,tsql,Sql Server,Tsql,我需要执行以下逻辑子句: 如果列存在,并且它具有一定的值,则执行某些操作。 如果没有,那就做点别的 IF EXISTS( SELECT * FROM sys.columns WHERE Name = N'legacyoptions' AND Object_ID = Object_ID(N'config ')) BEGIN if ( select legacyoptions from config)=1 begin

我需要执行以下逻辑子句:

如果列存在,并且它具有一定的值,则执行某些操作。 如果没有,那就做点别的

IF EXISTS(
    SELECT *
    FROM sys.columns 
    WHERE Name      = N'legacyoptions'
      AND Object_ID = Object_ID(N'config '))
BEGIN
    if ( select legacyoptions from config)=1 
        begin 
            Do stuff when legacy=1
        end
        else begin
            Do stuff when legacy !=1 
        END 
else 
begin
  do stuff when legacy is not present
end 

但是,如果legacyoptions不存在,这就不起作用了。试试这个:我猜你是在结束if

IF EXISTS(
    SELECT *
    FROM sys.columns 
    WHERE Name      = N'legacyoptions'
      AND Object_ID = Object_ID(N'config '))
BEGIN
    if ( select legacyoptions from config)=1 
        begin 
            Do stuff when legacy=1
        end
        else begin
            Do stuff when legacy !=1 
        END 
end
else 
begin
  do stuff when legacy is not present
end 

这行得通,但我觉得很愚蠢。 如果存在,请从sys.columns中选择*,其中Name=N'legacyoptions'和Object\u ID=Object\u IDN'config' 开始 行政长官 如果从配置中选择legacyoptions=1 开始 打印配置==1 终止 其他的 开始 打印配置!=1 终止 ' 终止 其他的 开始 打印“无遗产” 终止

以下是使用TRY-CATCH块和动态SQL的方法,因此在数据库中编译此代码块时,不会使用表配置和/或legacyOptionField

BEGIN TRY
    DECLARE @legacyoptions int;  
    EXECUTE sp_executesql N'select TOP 1 @legacyoptions=legacyoptions from config', 
                          N'@legacyoptions int OUTPUT', 
                          @legacyoptions OUTPUT;
    if @legacyoptions=1 
        begin 
          -- Do stuff when legacy=1
        end
        ELSE 
        BEGIN
          -- Do stuff when legacy !=1 
        END   
END TRY  
BEGIN CATCH  
     -- do stuff when legacy is not present
END CATCH 

动态SQL是一个不错的选择。我觉得你的SQL很好。什么意思不起作用?@ZoharPeled-如果配置表中没有名为legacyoptions的列,那么整个批处理都将无法编译。因此,它永远不会有机会运行测试来查看该列是否存在,然后运行查询该列的SELECT语句。@damien正确,当然…我不知道我怎么会错过它。很抱歉,这返回的列名“legacyoptions”无效。在缺少legacyoptions列的DB上运行时。如果我对第二个进行注释,如果结果是正确的,那么它工作正常,但这就是问题本身。为什么对您来说它看起来很愚蠢?您熟悉其他编程语言吗?原始代码是与之类似,在另一种语言中,尝试编写一个方法,该方法首先使用反射/内省来确定特定类型是否包含特定方法,然后在该类型的实例上调用该方法-由于同样的原因失败-它甚至无法编译代码,因此它从未有机会执行其r请等一下。