SQL Server版本无效:15 (Microsoft.SqlServer.Smo)

53
上下文:我在修改SQL Server 2016中的存储过程时遇到了困难。该存储过程执行文件中json数据的解析。出现问题的是,我能够成功地执行该存储过程,但当我尝试修改它时,会收到以下消息:

enter image description here

问题:是否有人有任何故障排除提示?以下是存储过程的内容。SQL Server 2016支持使用的各种函数,包括OPENJSON函数。

USE mattermark_sandbox
GO

CREATE PROCEDURE get_company_data 

AS

IF OBJECT_ID('tempdb..##jsondump') IS NOT NULL DROP TABLE ##jsondump
IF OBJECT_ID('tempdb..##jsonparsed') IS NOT NULL DROP TABLE ##jsonparsed
IF OBJECT_ID('tempdb..##json_loop') IS NOT NULL DROP TABLE ##json_loop

CREATE TABLE ##jsondump (
    [my_json] [nvarchar](max) NULL
) 

-- Create a table to house the parsed content
CREATE TABLE ##jsonparsed (
    [id] [int] NULL,
    [url] [varchar](255) NULL,
    [company_name] [varchar](255) NULL,
    [domain] [varchar](255) NULL
)

-- Clear ##jsondump
TRUNCATE TABLE ##jsondump;

-- Clear ##jsonparsed ( only if you don't want to keep what's already there )
TRUNCATE TABLE ##jsonparsed;

-- Import ( single column ) JSON
--IMPORTANT: Need to be sure the company_data.json file actually exists on the remote server in that directory 
BULK INSERT ##jsondump
FROM 'C:\mattermark_etl_project\company_data.json' -- ( <-- my file, point to your own )
WITH (
    ROWTERMINATOR = '\n'
);

-- Select JSON into ##jsonparsed
SELECT my_json 
INTO ##json_loop
FROM ##jsondump;

--SELECT * FROM ##jsondump;

INSERT INTO ##jsonparsed (
    id, [url], company_name, domain
)
SELECT DISTINCT
    jsn.id, jsn.[url], jsn.company_name, jsn.domain
FROM ##json_loop
OUTER APPLY (

    SELECT * FROM OPENJSON(##json_loop.my_json, '$.companies' )
    WITH (
        id INT '$.id',
        [url] VARCHAR(255) '$.url',
        company_name VARCHAR(255) '$.company_name',
        domain VARCHAR(255) '$.domain'
    )

) 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 ''Company_ID'', ''MatterMark_URL'', ''Company_Name'', ''Domain'' UNION ALL SELECT DISTINCT cast(id as varchar( 12 )) as id, url, company_name, domain FROM ##jsonparsed" queryout ' +
    ' "C:\mattermark_etl_project\company_data.txt" -T -c -q -t0x7c -r\n';
PRINT @bcp_cmd4;
EXEC master..xp_cmdshell @bcp_cmd4,no_output;

SELECT DISTINCT * FROM ##jsonparsed
ORDER BY id ASC;

DROP TABLE ##jsondump 
DROP TABLE ##jsonparsed 
DROP TABLE ##json_loop 

/*
-- To allow advanced options to be changed.  
EXEC sp_configure 'show advanced options', 1;  
GO  

-- To update the currently configured value for advanced options.  
RECONFIGURE;  
GO  

-- To enable the feature.  
EXEC sp_configure 'xp_cmdshell', 1;  
GO  

-- To update the currently configured value for this feature.  
RECONFIGURE;  
GO  
*/

exec xp_cmdshell 'C:\mattermark_etl_project\powershell "C:\mattermark_etl_project\open_file.ps1"',no_output


1
你在操作的哪个阶段遇到了这个错误?是在点击执行时吗? - Dale K
4
您确定您的 SQL Server 和 SSMS 版本都是 2016 吗?SSMS 可以连接到任何数据库版本。该错误意味着脚本包含不受支持的功能,可能是在数据库引擎或管理工具中。请尝试使用 select @@version 命令。 - Dale K
9
似乎你正在尝试使用SSMS 2016与SQL Server 2019数据库进行交互。 - Dale K
2
是的,但是有些函数在SSMS中无法与数据库引擎进行适当的交互,因为它是较新版本。如果您将SSMS升级到相同的版本,则所有问题都应该解决。 - Dale K
3
使用SSMS 18.0版本代替17.0版本似乎有效。 - emalcolmb
显示剩余2条评论
4个回答

48

18
很遗憾,SSMS 18不支持调试T-SQL,如果想要调试存储过程需要安装VS并使用SSDT,但是这样做很麻烦(而且许多人报告称,在SQL Server 2019上调试T-SQL时,SSDT当前会卡住,_哎呀_)。 - Dai
2
大家好,请在此处签署用户反馈,以帮助将调试器重新加入SSMS: https://feedback.azure.com/forums/908035-sql-server/suggestions/35881492-put-debugger-back-into-ssms-18 - hamid reza
23
为什么我需要使用SSMS 18.0才能查看存储过程的定义?毫无意义。根据Dai的说法,缺乏调试只是垃圾。太令人沮丧了。 - Shiv
2
同意!@shiv - emalcolmb
1
@hamidreza 看起来用户反馈链接已经失效了,你能否发布一个更新的链接?如果还未解决这个问题的话,是否可以提供一下最新进展?我很想对此进行投票。 - BrainSlugs83

19

您可以使用查询查看存储过程的定义,而无需安装新的SSMS。 在运行此查询之前,可以选择使用SSMS菜单项查询 -> 结果到 -> 结果到文本将结果格式化为一个文本字段。

exec sp_helptext [get_company_data]

(其中get_company_data是存储过程名称。)

另外请注意,存储过程的“修改”选项只是打开一个常规查询选项卡,并填充定义作为ALTER PROCEDURE,您可以通过在普通查询选项卡中运行ALTER PROCEDURE来更新它。


3
这个问题有一个解决方法: 不要选择“修改”,而是右键单击数据库名称,选择“任务”>“生成脚本:选择特定对象”,然后选中你的对象。

-1
如果您正在使用Oracle服务器,则请使用OPENQUERY。选择语法如下:
  select * from OPENQUERY(LINK_SERVER_NAME,'select * from DUAL')  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接