我正在尝试运行以下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中将返回空字符串。