SQL 语法 ETL 脚本

DSQL Syntax ETL Script

我在使用语法正确但不正确的 ETL 脚本时遇到问题 运行;它是 where 子句变量,它使用元数据 table 中的数据。除了相关代码,我已经编辑了所有代码:


DECLARE @table VARCHAR(200) = 'MyTable'
DECLARE @w_clause NVARCHAR(MAX)
DECLARE @j_clause NVARCHAR(MAX)

-- Get non-primary key column names
DROP TABLE IF EXISTS #temp0
SELECT [Name], FieldType
INTO #temp0 
FROM dbo.metadata
WHERE [Table] = @table AND 
      ETL_Active = 1 AND 
      [Name] IS NOT NULL AND 
      PrimaryKey <> 1


-- Get primary key column names
DROP TABLE IF EXISTS #temp1
SELECT [Name]
INTO #temp1
FROM dbo.metadata
WHERE [Table] = @table AND
      ETL_Active = 1 AND
      [Name] IS NOT NULL AND
      PrimaryKey = 1


SELECT @w_clause = COALESCE(@w_clause+' OR ','') + 'COALESCE(prd.'+ [Name] +',' + CASE WHEN FieldType IN('char','varchar', 'nvarchar', 'nchar') THEN '''' ELSE 0 END +')' FROM #temp0
PRINT @w_clause
SELECT @j_clause = COALESCE(@j_clause+' AND ','') + 'prd.'+ [Name] + ' = ' + 'stg.' + [Name] FROM #temp1
PRINT @j_clause

我遇到的错误:

Msg 245, Level 16, State 1, Line xx
Conversion failed when converting the varchar value ')' to data type int.

当我尝试对 WHERE 子句的变量进行 COALESCE(prd 动态 SQL 赋值时,会发生这种情况。这让我很沮丧,所以任何帮助表示赞赏。谢谢

您应该使用 CONCAT 而不是 + 进行字符串连接。使用 + 时,您必须将两个参数都转换为字符串,并将 NULL 替换为 ''。 CONCAT 为您做到这两点。

应该是:

SELECT @w_clause = COALESCE(@w_clause+' OR ','') + 'COALESCE(prd.'+ [Name] +',' + CASE 
WHEN FieldType IN('char','varchar', 'nvarchar', 'nchar') THEN '''' ELSE '0' END +')' 

SELECT @w_clause = concat(COALESCE(@w_clause+' OR ',''), 'COALESCE(prd.', [Name], ',',  CASE WHEN FieldType IN('char','varchar', 'nvarchar', 'nchar') THEN '''' ELSE '0' END ')' )