如何仅在表列存在的情况下将视图列设置为该列的值



我正在尝试运行以下CREATE VIEW脚本,该脚本需要有一个列值,如果该列在另一个表中不存在,则为空(''(,如果存在,则是该列的值。

CREATE VIEW [DG].[PERIOD_FCY] AS 
DECLARE @FIY TINYINT
IF EXISTS(
SELECT * FROM
INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'PERIOD' 
AND COLUMN_NAME = 'FIYNUM_0'
) SET @FIY = 1  ELSE SET @FIY = 0 
SELECT
CASE WHEN @FIY = 1 THEN P.FIYNUM_0 ELSE '' END
/*[...]*/
FROM [DCT].PERIOD P 

当然,问题是如果列不存在(FIYNUM_0(,case语句总是会失败。

关于如何避开这个问题,有什么建议吗?

感谢

实现这一点的最佳方法是,首先您必须创建自己的函数,通过使用PERIOD表主键id字段来获取该字段(FIYNUM_0(值,在该函数上,我们将控制现有列FIYNUM_0。如果存在列,我们使用输入参数作为id字段,从PERIOD表中返回该字段值。否则,我们将返回"。例如:

Create function GET_FIYNUM_0 
(
@table_id integer
)  
returns 
varchar(200)  
begin  
declare 
@pdata varchar(200)

IF (exists(select tbl.object_id 
from sys.columns col 
inner join sys.tables tbl on tbl.object_id = col.object_id 
where col.name = 'FIYNUM_0' and tbl.name = 'PERIOD')) 
begin 
SELECT @pdata = FIYNUM_0 from TEST_DB.dbo.PERIOD where id = @table_id
end else 
begin 
SET @pdata = ''
end

RETURN @pdata
end

但在那之后,我们可以非常非常容易地创建我们的视图。示例:

CREATE VIEW PERIOD_FCY
AS
SELECT   
dbo.GET_FIYNUM_0(PER.ID) as MYFIELD
from 
TEST_DB.dbo.PERIOD PER

如果此列存在,此GET_FIYNUM_0(PER.ID)将返回FIYNUM_0字段值,但在else中将返回空字符串。

最新更新