OPENJSON()在SQLCMD返回0行,SSMS却返回大量行的问题求助
OPENJSON()在SSMS中正常运行但SQLCMD执行返回0行的问题
我有一组使用OPENJSON()的SQL查询,在SQL Server Management Studio(SSMS)中执行能正常返回结果,但通过命令提示符用sqlcmd执行时,查询返回0行。
示例SQL语句
INSERT INTO [common].[dbo].[distrcd] (schyr, distrcd, beginschyr, endschyr, cooprcdt, coopdistname, adminname, adminphone, adminemail, fax, address1, address2, city, [state], zip) SELECT * FROM OPENJSON(@JsonDefinition) WITH (schyr VARCHAR(9) '$.schoolYear', distrcd VARCHAR(5) '$.distributionCode', beginschyr VARCHAR(9) '$.beginSchoolYear', endschyr VARCHAR(9) '$.endSchoolYear', cooprcdt VARCHAR(11) '$.coopRCDT', coopdistname VARCHAR(33) '$.coopName', adminname VARCHAR(30) '$.adminName', adminphone VARCHAR(10) '$.adminPhone', adminemail VARCHAR(100) '$.email', fax VARCHAR(10) '$.fax', address1 VARCHAR(50) '$.address1', address2 VARCHAR(50) '$.address2', city VARCHAR(33) '$.city', [state] VARCHAR(2) '$.state', zip VARCHAR(5) '$.zipCode') WHERE ISJSON(@JsonDefinition) > 0;
这条语句在SSMS中执行时能成功插入181行!
SQLCMD执行命令
sqlcmd -S server -U username -P password -i \\server\share\ApiTest.sql
执行后返回结果为(0 rows affected)。
我已经确认@JsonDefinition变量在SSMS和SQLCMD环境中都已正确填充,看起来OPENJSON()执行异常但没有抛出错误,以下是可能的原因及解决方向:
- QUOTED_IDENTIFIER设置差异:SSMS默认启用
SET QUOTED_IDENTIFIER ON,而SQLCMD默认可能为OFF。OPENJSON()要求必须启用该设置才能正常解析JSON路径中的引号。解决方法是在脚本开头添加SET QUOTED_IDENTIFIER ON;强制开启。 - JSON字符串转义问题:如果
@JsonDefinition是在脚本中直接赋值,SQLCMD对字符串转义的处理逻辑和SSMS不同(比如双引号的转义规则),可能导致实际传入的JSON格式无效,ISJSON()返回0,从而没有数据插入。可以在脚本中添加PRINT @JsonDefinition,分别在两种环境中输出对比实际内容,检查转义是否正确。 - 数据库上下文或权限差异:SQLCMD使用的登录账号可能默认数据库上下文与SSMS不同,导致对
[common].[dbo].[distrcd]表的访问逻辑有差异。可以在脚本开头添加USE common;明确指定数据库上下文,同时确认账号对目标表的读写权限一致。 - SQL Server版本兼容性:
OPENJSON()从SQL Server 2016开始支持,需确认SQLCMD和SSMS连接的是同一个SQL Server实例,且版本一致,避免因版本差异导致功能不兼容。
内容的提问来源于stack exchange,提问作者mortodestructo
相关产品推荐
相关产品推荐

