SQL Server 无效版本:15 (Microsoft.SqlServer.Smo)
Posted
技术标签:
【中文标题】SQL Server 无效版本:15 (Microsoft.SqlServer.Smo)【英文标题】:SQL Server Invalid version: 15 (Microsoft.SqlServer.Smo) 【发布时间】:2019-07-30 00:16:07 【问题描述】:上下文:我在修改 SQL Server 2016 中的存储过程时遇到了困难。该存储过程执行文件中 json 数据的解析。由于某种原因,我能够执行存储过程并成功执行,但是当我尝试修改存储过程时,我收到以下消息:
问题:有人有任何故障排除提示吗?下面是存储过程的内容。 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
【问题讨论】:
您在操作的哪个阶段收到此错误?当你点击执行? 您是否 100% 确定您的 SQL Server 和 SSMS 版本都是 2016? SSMS 允许您连接到任何数据库版本。该错误意味着脚本包含数据库引擎或管理工作室中不受支持的功能。试试select @@version
您似乎正在尝试使用 SSMS 2016 与 SQL Server 2019 数据库通信。
是的,但将会发生的是,对于某些功能,SSMS 不具备与数据库引擎正确交互的能力,因为它的版本较新。如果您将 SSMS 升级到相同的版本,一切都会好起来的。
使用 SSMS 版本 18.0 而不是 17.0 似乎可以正常工作。
【参考方案1】:
使用 SSMS 版本 18.0 而不是 17.0 似乎可以正常工作。
您可以从https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017下载它
【讨论】:
很遗憾 SSMS 18 不支持调试 T-SQL,安装 VS 使用 SSDT 调试 sprocs 是一个巨大的痛苦(而且很多人报告 SSDT 目前在 SQL Server 上调试 T-SQL 时挂起2019,欢乐)。 大家,请在此处签署此用户语音相关项目以帮助其返回 SSMS:feedback.azure.com/forums/908035-sql-server/suggestions/… 为什么我需要 SSMS 18.0 来查看 proc 的定义?没有意义。按照 Dai 的说法,缺乏调试就是垃圾。太令人沮丧了。 同意! ?@shiv【参考方案2】:您可以使用查询来查看存储过程定义,而无需安装新的 SSMS。
在运行此查询之前,您可以选择使用 SSMS 菜单项 Query -> Results To -> Results to Text
将结果格式化为一个文本字段。
exec sp_helptext [get_company_data]
(其中get_company_data
是存储过程名称。)
另请注意,存储过程“修改”选项只会打开一个常规查询选项卡,该选项卡预先填充了 ALTER PROCEDURE
的定义,您可以通过在常规查询选项卡中运行 ALTER PROCEDURE
来更新它。
【讨论】:
以上是关于SQL Server 无效版本:15 (Microsoft.SqlServer.Smo)的主要内容,如果未能解决你的问题,请参考以下文章
以 10 为基数的 int() 的无效文字:Django 网页上的“Micro”