【发布时间】:2019-12-09 13:31:24
【问题描述】:
上下文:我们的核心应用程序的一项功能取决于 SQL Server 中存储过程的输出文件。该文件应该通过
BCP 实用程序。
问题: 与无效对象名称相关的错误似乎是罪魁祸首。该过程正在生成以下错误。我非常不清楚该过程中引用的全局临时表如何/为什么使用无效名称。我尝试用不能解决问题的标准表替换临时表。有人可以提供一些提示/技巧吗?
存储过程:
IF OBJECT_ID('tempdb..##jsondump_personnel') IS NOT NULL
DROP TABLE ##jsondump_personnel
IF OBJECT_ID('tempdb..##jsonparsed_personnel') IS NOT NULL
DROP TABLE ##jsonparsed_personnel
IF OBJECT_ID('tempdb..##json_loop_personnel') IS NOT NULL
DROP TABLE ##json_loop_personnel
CREATE TABLE ##jsondump_personnel
(
[my_json] [NVARCHAR](MAX) NULL
)
CREATE TABLE ##jsonparsed_personnel
(
[name] [VARCHAR](255) NULL,
title [VARCHAR](255) NULL,
[path] [VARCHAR](255) NULL
)
TRUNCATE TABLE ##jsondump_personnel;
TRUNCATE TABLE ##jsonparsed_personnel;
BULK INSERT ##jsondump_personnel
FROM 'C:\mattermark_etl_project\personnel_data.json'
WITH (
ROWTERMINATOR = '\n'
);
SELECT my_json
INTO ##json_loop_personnel
FROM ##jsondump_personnel;
--SELECT * FROM ##jsondump;
INSERT INTO ##jsonparsed_personnel ([name], title, [path])
SELECT DISTINCT
jsn.[name], jsn.[title], jsn.[path]
FROM
##json_loop_personnel
OUTER APPLY
(SELECT *
FROM OPENJSON(##json_loop_personnel.my_json)
WITH (
[name] VARCHAR(255) '$.name',
title VARCHAR(255) '$.title',
[path] VARCHAR(255) '$.path'
)) AS jsn
DECLARE @bcp_cmd4 VARCHAR(1000);
DECLARE @exe_path4 VARCHAR(200) =
' cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn\ & ';
SET @bcp_cmd4 = @exe_path4 +
' BCP.EXE "SELECT ''Name'', ''Title'', ''Path'' UNION ALL SELECT DISTINCT name, title, path FROM ##jsonparsed_personnel" queryout ' +
' "C:\mattermark_etl_project\personnel_data.txt" -T -c -q -r\n';
PRINT @bcp_cmd4;
EXEC master..xp_cmdshell @bcp_cmd4
SELECT DISTINCT *
FROM ##jsonparsed_personnel
DROP TABLE ##jsondump_personnel
DROP TABLE ##jsonparsed_personnel
DROP TABLE ##json_loop_personnel
EXEC xp_cmdshell 'C:\mattermark_etl_project\powershell "C:\mattermark_etl_project\open_personnel_file.ps1"'
错误:
SQLState = S0002,NativeError = 208
错误 = [Microsoft][SQL Server Native Client 10.0][SQL Server]无效的对象名称 '##jsonparsed_personnel'SQLState = 37000,NativeError = 8180
错误 = [Microsoft][SQL Server Native Client 10.0][SQL Server]无法准备语句。
【问题讨论】:
-
你能确定哪一行包含
##jsonparsed_personnel会触发错误吗?如果您直接从 SSMS 运行该脚本而不是调用“sproc”,该脚本是否有效? -
这是这一行:' BCP.EXE "SELECT ''Name'', ''Title'', ''Path'' UNION ALL SELECT DISTINCT name, title, path FROM ##jsonparsed_personnel" queryout ' + ' "C:\mattermark_etl_project\personnel_data.txt" -T -c -q -r\n'; powershell 脚本不起作用,因为未创建输出文件。
-
学习调试你的动态sql。在您的问题中发布该字符串的实际内容,而不是作为评论。然后获取生成这些全局临时表的所有代码(直到尝试使用 bcp)并在 ssms 的查询窗口中运行它。然后获取该动态 bcp 命令并在执行此代码的机器上的命令窗口中运行它。那样有用吗?您没有为 bcp 命令提供实例名称 - 那么它使用哪个实例以及哪个实例具有这些全局临时表?
-
@SM 或者我冒险猜测它是分配为
@bcp_cmd4的内容。bcp中缺少服务器/实例参数-S肯定是罪魁祸首。 -
抱歉,我不是动态 sql 方面的专家。不确定“字符串的内容”是什么意思——动态 sql 查询的结果?您是否在询问是否在执行 BCP 实用程序的同一服务器实例上创建了全局临时表?是的,这些命令在同一台机器上的存储过程中,所以是的,它是相同的实例和 spid。我可以尝试提供 -S 参数,看看是否有帮助。
标签: sql-server powershell tsql bcp open-json