【发布时间】:2021-10-03 08:10:46
【问题描述】:
我有一个 json 字符串,它是数据工厂中 Get Metadata 活动的结果,格式如下:{"structure": [{"name": "Id","type": "String"},{"name": "IsDeleted","type": "Boolean"},{"name": "RowVersion","type": "Byte[]"}, {"name": "ModelId","type": "String"}]
这个 json 显示了 parquet 文件的模式。我将此 json 连同 parquet 文件名和 uctnow() 传递给一个存储过程,以使用以下代码为该文件创建一个模式表
CREATE OR ALTER PROCEDURE [CreateExternalTables] (
@schema NVARCHAR (MAX), @tableName NVARCHAR(MAX), @ExecTime NVARCHAR(MAX)
) AS
BEGIN
IF OBJECT_ID('tempdb..#tables_to_create', 'U') IS NOT NULL
DROP TABLE #tables_to_create
CREATE TABLE #tables_to_create (
tableName NVARCHAR (MAX),
fieldOrder NVARCHAR (MAX),
fieldName NVARCHAR (MAX),
fieldType NVARCHAR (MAX),
translatedType NVARCHAR (MAX),
executeTime NVARCHAR (MAX)
)
BEGIN
WITH Fields (fieldOrder, fieldName, fieldType) AS (
SELECT
[key] AS fieldOrder,
JSON_VALUE([value], '$.name') AS fieldName,
JSON_VALUE([value], '$.type') AS fieldType
FROM
OPENJSON(@schema)
)
INSERT INTO
#tables_to_create(
tableName,
fieldOrder,
fieldName,
fieldType,
translatedType,
executeTime
)
SELECT
@tableName,
fieldOrder,
fieldName,
fieldType,
CASE
WHEN fieldType = 'Single' THEN 'real'
WHEN fieldType = 'Boolean' THEN 'bit'
WHEN fieldType = 'Double' THEN 'float'
WHEN fieldType = 'Int64' THEN 'bigint'
ELSE NULL
END AS translatedType,
@ExecTime
FROM
Fields
END
END;
我想做的是在存储过程中创建这个 temo 表,以便以自动方式创建外部表。
确切地说,我正在按照此链接进行操作: create-external-dataset
非常感谢任何帮助。
更新 在@wBob 的帮助下解决了第一个问题后,我按照链接的其余部分创建外部表,并将以下内容插入到我的存储过程中:
FROM
Fields
END
Declare @sqlCommand nvarchar(max);
Declare @folderPath nvarchar(max);
SET
@sqlCommand = 'IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[' + @tableName + ']'') AND type in (N''U''))
CREATE EXTERNAL TABLE [dbo].[' + @tableName + '] ('
WHILE((SELECT COUNT(*) FROM #tables_to_create) > 0)
BEGIN
DECLARE @key int
SELECT
@key = MIN(fieldOrder)
FROM
#tables_to_create
WHERE
executeTime = @ExecTime
DECLARE @fieldName VARCHAR(50)
DECLARE @translatedType VARCHAR(50)
SELECT
@fieldName = fieldName,
@translatedType = translatedType
FROM
#tables_to_create
WHERE
fieldOrder = @key
AND executeTime = @ExecTime
SET
@sqlCommand = @sqlCommand + '
[' + @fieldName + '] [' + @translatedType + '] NULL'
DELETE FROM
#tables_to_create
WHERE
fieldOrder = @key
AND executeTime = @ExecTime
IF((SELECT COUNT(*) FROM #tables_to_create WHERE executeTime = @ExecTime) > 0)
SET
@sqlCommand = @sqlCommand + ', '
END
SET
@sqlCommand = @sqlCommand + '
)
WITH
(
LOCATION = ''/' + /main/json/ + ''',
DATA_SOURCE = DataLakeStaged,
FILE_FORMAT = StagedParquet
)'
EXEC(@sqlCommand)
END;
【问题讨论】:
-
也许可以试试
@string(activity("Get Metadata ... etc? -
@wBob 是的,它成功了!现在请您帮助我更新问题的第二部分查询吗?
-
@wBob 非常感谢
标签: stored-procedures azure-data-factory parquet azure-data-lake azure-synapse