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请等一下。