1

上下文:我们的核心应用程序的一个特性依赖于 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]无法准备语句。

4

1 回答 1

0

我发现问题可以通过将块 a 简化为块 b 来解决:

阻止一个

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

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'
于 2019-08-01T23:24:51.563 回答