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 ')' )
我在使用语法正确但不正确的 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 ')' )