我有两个表,其中只有一列是相同的。我正在尝试编写一个存储过程,该存储过程从传入的列名中提取一个值,但仅存在于其中一个表中。这是我写的:
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语句为true,也只能在TableA中提取内容,这在最后一行给了我“无效的列名”错误。我注意到,如果用执行相同操作的存储过程替换底部的两个SELECT语句,则它会起作用。SQL不会尝试执行IF为false的情况。
我想将所有内容保存在一个存储过程中。最好的方法是什么?
您的查询无法执行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