我在 Data Mart 中创建了一个非常简单的表来存储 ETL 诊断信息:
CREATE TABLE [internal].[etl_status]
(
[property_name] VARCHAR(100) NOT NULL PRIMARY KEY,
[property_value] VARCHAR(MAX) NULL
)
然后我创建了一个存储过程来处理对该表的插入/修改。除了方便之外,我还必须这样做,因为 Microsoft 尚未将 T-SQL 语句活动添加到 Azure 数据工厂。
问题是,我不知道如何让存储过程接受 T-SQL 函数作为参数。事实上,我相信这可能是不可能的。所以这是我的小解决方法:
CREATE PROCEDURE [internal].[sp_set_etl_status]
@propertyName VARCHAR(100)
,@propertyValue VARCHAR(MAX)
AS
DECLARE @query AS VARCHAR(MAX)
-- Case statement to handle functions passed as propertyValue parameter
-- NOT IDEAL, see solution by Scott Hodgin below
SET @propertyValue = CASE @propertyValue
WHEN 'GETDATE()' THEN CONVERT(VARCHAR(MAX),CONVERT(DATETIME2(2), GETUTCDATE()))
ELSE @propertyValue
END
SET @query = '
BEGIN
IF NOT EXISTS ( SELECT * FROM [internal].[etl_status]
WHERE [property_name] =''' + @propertyName + ''')
BEGIN
INSERT INTO [internal].[etl_status]
VALUES (''' + @propertyName + ''', NULL)
END
END
UPDATE [internal].[etl_status]
SET [property_value] = ''' + @propertyValue+ '''
WHERE [property_name] = ''' + @propertyName + '''
;'
EXEC(@query)
这按预期工作。但是对于当前的解决方案,我需要为我想要处理的每个函数都有一个 CASE 语句。
编辑: Scott Hodgin 下面的建议是一个可以接受的解决方案。但是我添加了一个默认值FALSE
to@propertyValueIsFunction
如下@propertyValueIsFunction BIT = FALSE
: