SQL 服务器 -- 错误 = [Microsoft] [SQL 服务器 Native Client 10.0][SQL 服务器] 对象名称无效
SQL Server -- Error = [Microsoft] [SQL Server Native Client 10.0][SQL Server] Invalid object name
上下文: 我们核心应用程序的一项功能取决于 SQL 服务器中存储过程的输出文件。该文件应该通过输出
BCP
实用程序。
问题: 与无效对象名称相关的错误似乎是罪魁祸首。该过程正在生成以下错误。我非常不清楚 how/why 程序中引用的全局温度 table 使用了无效名称。我尝试用标准 tables 替换 temp tables,但这并没有解决问题。有人可以提供一些 tips/tricks 吗?
存储过程:
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 Server0\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
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid object name '##jsonparsed_personnel'
SQLState = 37000, NativeError = 8180
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement(s) could not be prepared.
我发现问题可以通过将块 a 简化为块 b 来解决:
块一个
DECLARE @bcp_cmd4 VARCHAR(1000);
DECLARE @exe_path4 VARCHAR(200) =
' cd C:\Program Files\Microsoft SQL Server0\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
块b
--https://sqlwithmanoj.com/tag/bcp-queryout/
exec master..xp_cmdshell 'BCP "SELECT ''Name'', ''Title'', ''Path'' UNION ALL SELECT DISTINCT name, title, path FROM mattermark_sandbox.dbo.jsonparsed_personnel" QUERYOUT C:\mattermark_etl_project\personnel_data.txt -T -c'
上下文: 我们核心应用程序的一项功能取决于 SQL 服务器中存储过程的输出文件。该文件应该通过输出
BCP
实用程序。
问题: 与无效对象名称相关的错误似乎是罪魁祸首。该过程正在生成以下错误。我非常不清楚 how/why 程序中引用的全局温度 table 使用了无效名称。我尝试用标准 tables 替换 temp tables,但这并没有解决问题。有人可以提供一些 tips/tricks 吗?
存储过程:
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 Server0\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
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid object name '##jsonparsed_personnel'SQLState = 37000, NativeError = 8180
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement(s) could not be prepared.
我发现问题可以通过将块 a 简化为块 b 来解决:
块一个
DECLARE @bcp_cmd4 VARCHAR(1000);
DECLARE @exe_path4 VARCHAR(200) =
' cd C:\Program Files\Microsoft SQL Server0\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
块b
--https://sqlwithmanoj.com/tag/bcp-queryout/
exec master..xp_cmdshell 'BCP "SELECT ''Name'', ''Title'', ''Path'' UNION ALL SELECT DISTINCT name, title, path FROM mattermark_sandbox.dbo.jsonparsed_personnel" QUERYOUT C:\mattermark_etl_project\personnel_data.txt -T -c'