报错问题:
关键字 'with' 附近有语法错误。如果此语句是公用表表达式、xmlnamespaces 子句或者更改跟踪上下文子句,那么前一个语句必须以分号结尾。
原因:
数据库2008版本
不支持
OPENJSON函数,因此需要把服务器的兼容级别调整了
2016或以上
。
解决方法:
选中数据库->右键并选择属性->选项->修改兼容性级别为2016(建议使用最下方命令进行修改)
注意:
如果在用户连接到数据库时更改兼容级别,可能会使活动查询产生不正确的结果集。例如,如果在编写查询计划时兼容级别发生更改,则编写后的计划可能同时基于旧的和新的兼容级别,从而造成计划不正确,并可能导致结果不准确。此外,如果将计划放在计划缓存中供后续的查询重用,则问题可能更加复杂。为了避免查询结果不准确,建议您使用以下过程来更改数据库的兼容级别:
--将用户设置为多用户访问模式
SELECT name ,compatibility_level ,recovery_model_desc FROM sys.databases WITH(NOLOCK);
USE master;
-- 将用户设置为单用户访问模式
ALTER DATABASE 数据库名称 SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
-- 修改数据库的兼容级别
ALTER DATABASE 数据库名称 SET COMPATIBILITY_LEVEL = 130;
-- 将用户设置为多用户访问模式
ALTER DATABASE 数据库名称 SET MULTI_USER;
附:若数据库版本只能使用2008,解析Json可参照如下链接:
SqlServer2008如何解析Json—附详细代码_咏絮v的博客-CSDN博客
openJson:打开Json字符串
IsJson:判断一个字符串是不是合法的Json格式。是返回1,否返回0,null返回null。
Json_Value:从Json字符串中提取值。
Json_Query:Json字符串中提取对象或数组。
Json_Modify:更新Json字符串中的属性值,并返回更新的Json字符串。
开始之前:创建示例数据
declare @json_str varchar(max)
set @json_str='[
{"key":3,"value1":10,"value2":[{"vv21":13,"vv22":103}],"value3":n
这个事儿的背景吧就是因为加锁查询速度太慢,于是让咱优化,至少先通过使用with(nolock)来解决查询慢的问题,这么个事儿说来也简单对伐,但是影响范围特别大,因为要优化的这个存储过程是个动态存储过程,有70多个操作行为DAO调用到了这个存储过程,可谓牵一发而动全身。
报错了!
一开始自信满满,参照了一篇文章了解了解with(nolock)咋玩儿
SQL Server 中WITH (NOLOCK...
sdm_bom_relation u
INNER JOIN cte_sdm_bom_relation t ON u.matcode_parent = t.matcode AND u.tenant_code = 'asusp'
SELECT
cte_sdm_bom_relation
WHERE plan_code = 'WKASUSP01202555';
> Msg 156, Level 15, State 1, Server 10_0_24_9, Procedure , Line 0
关键字 'WITH' 附近有语法错误。
> Msg 319, Level 15, State 1, Server 10_0_24_9, Procedure , Line 0
关键字 'with' 附近有语法错误。如果此语句是公用表表达式、xmlnamespaces 子句或者更改跟踪上下文子句,那么前一个语句必须以分号结尾。
> Msg 102, Level 15, State 1, Server 10_0_24_9, Procedure , Line 0
“)”附近有语法错误。
> [42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]关键字 'WITH' 附近有语法错误。 (156)
[42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]关键字 'with' 附近有语法错误。如果此语句是公用表表达式、xmlnamespaces 子句或者更改跟踪上下文子句,那么前一个语句必须以分号结尾。 (319)
[42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]“)”附近有语法错误。 (102)
> 时间: 0.029s
IBatis中#号和$号的区别:
用“#”的话,ibatis会在你的变量前后加上“'”(单引号),而用“$”的话,则不会加“'”(单引号)
#Table#à’Table’ $Table$àTable
可以使用如下语句测试sql语句执行的时时间
CHECKPOINT
DBCC FREEPROCCACHE
DBCC DROPCLEA...
该表包含错误消息编号和描述,它是sys.messages目录视图中错误消息的文本。 如果适用,错误编号是指向更多信息的链接。
此列表并不详尽。 有关所有错误的完整列表,请使用以下查询查询sys.messages目录视图:
SELECT message_id AS Error, severity AS Severity,
[Event Logged] = CASE is_event_logged WHEN 0 THEN 'No' ELSE 'Yes' END,
text AS [Description]
七、数据库登录名、服务器角色、权限管理等操作
--1、使用T-SQL修改服务器的认证模式
xp_instance_regwrite N'HKEY_LOCAL_MACHINE',N'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer','LoginMode',N'REG_DWORD',2
--1、windows身份认证
--2、SQL S...
关键字 'with' 附近有语法错误。如果此语句是公用表表达式、xmlnamespaces 子句或者更改跟踪上下文子句,那么前一个语句必须以分号结尾。
在SQL Server中,出现“
关键字 '
with'
附近有
语法错误。如果此
语句是
公用表表达式、
xmlnamespaces 子句或者更改跟踪上下文子句,那么
前一个语句必须以
分号结尾”的错误,通常是因为在
使用`
WITH`
关键字(如在`
OPENJSON`的`
WITH`
子句)之
前的
语句没有以
分号结尾。
以下是解决该问题的方法:
#### 1. 确保
前一个语句以
分号结尾
当在
使用`
OPENJSON`的`
WITH`
子句时,如果
前面有其他
语句,需要在该
语句末尾添加
分号。例如,修改之
前的代码:
```sql
-- 定义包含多个JSON对象的JSON数据
DECLARE @json NVARCHAR(MAX) = '[
"id"
: 1283700766401617920,
"invoiceId"
: 1283700766330314752
-- 注意这里添加了
分号
;INSERT INTO #TempTable
SELECT
j.id,
j.invoiceId
OPENJSON(@json)
WITH (
id BIGINT,
invoiceId BIGINT
) AS j;
#### 2. 检查代码中是否存在隐藏的
语法错误
有时候,错误可能并不是真正在`
WITH`
关键字附近,而是之
前的
语句存在
语法错误。需要仔细检查代码,确保每个
语句的语法都是正确的。
#### 3. 代码示例
以下是
一个完整的示例,确保所有
语句都以
分号结尾:
```sql
-- 定义包含多个JSON对象的JSON数据
DECLARE @json NVARCHAR(MAX) = '[
"id"
: 1283700766401617920,
"invoiceId"
: 1283700766330314752
-- 创建临时表
CREATE TABLE #TempTable (
id BIGINT,
invoiceId BIGINT
-- 插入数据,注意
前一个语句以
分号结尾
;INSERT INTO #TempTable
SELECT
j.id,
j.invoiceId
OPENJSON(@json)
WITH (
id BIGINT,
invoiceId BIGINT
) AS j;
-- 查询临时表数据
SELECT * FROM #TempTable;
-- 删除临时表
DROP TABLE #TempTable;
SqlServer2008使用OpenJson函数报错:关键字 ‘with‘ 附近有语法错误。如果此语句是公用表表达式xmlnamespaces 子句或者更改跟踪上下文子句那么前一个语句必须以分号结尾
szdl88:
Vue+element ui+echart柱形图—附代码
ztiongtiong:
win11安装IIS步骤—图解
ChaITSimpleLove:
直接在浏览器中访问程序无问题,在IIS中点击浏览网站无反应