2011-06-17 83 views
1

我有两个表,其中只有一列是相同的。我试图编写一个存储过程,它从传入的列名称中提取值,但只存在于其中一个表中。这就是我写:来自两个表之一的SQL数据

IF EXISTS(
SELECT identifier FROM TableA WHERE identifier='12345') 
SELECT ColumnWhichOnlyExistsInA FROM TableA WHERE identifier='12345' 
ELSE 
SELECT ColumnWhichOnlyExistsInA FROM TableB WHERE identifier='12345' 

这使我在最后一行的“无效的列名称错误,即使IF语句是真实的,它应该只从表A拉东西。我注意到,如果我用做同样事情的存储过程替换底部的两条SELECT语句,它会起作用; SQL不会尝试执行IF为false的那个。

我想将所有内容保存在一个存储过程中。最好的做法是什么?

回答

1

由于编译器检查要选择的列是否存在于相应的表中,因此您的查询无法编译COMPILE,因此IF语句从未得到执行。

它在单独的存储过程中工作,因为它们是在运行时按需编译的,因此只会编译“工作”存储过程。

要解决的问题使用动态SQL

DECLARE @SQLString varchar(max) 
IF EXISTS (SELECT idenfier FROM TableA WHERE identifier='12345') 
BEGIN 
    SET @SQLString = 'SELECT ColumnWhichOnlyExistsInA FROM TableA WHERE identifier=''12345''' 
END 
ELSE 
BEGIN 
    SET @SQLString = 'SELECT ColumnWhichOnlyExistsInA FROM TableB WHERE identifier=''12345''' 
END 

EXECUTE sp_executesql @SQLString 
+0

该解决方案看起来很有希望。我会尝试并回来。 – Alec 2011-06-17 14:05:51

0

您是否试过将模式作为第一次测试进行查询?从INFORMATION_SCHEMA.COLUMNS如 选择table_name的,其中列名=“ColumnWhichOnlyExistsInA”

0

的SQL可以运行之前,分析器将试图解析SQL这也意味着它会尝试检查所有的引用列在表或不

例如下面将不工作怎么把有名字name1表中没有列sys.table

IF EXISTS(SELECT 1 FROM sys.tables WHERE name='foo') 
    SELECT * from sys.objects where name= 's' 
ELSE 
    SELECT * from sys.tables where name1= 's' 

所以,如果表B没有标识为一列的错误将拿出

相关问题