为什么我应该或不应该使用脏读:
set transaction isolation level read uncommitted
在SQL Server中?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
练习sql过程中代码一直报这个错太痛苦了:在递归查询 "BOM" 的列 "parent_itemcode" 中,定位点类型和递归部分的类型不匹配。
以下是代码:
-- 物料编码是 @InputItemCode
DECLARE @InputItemCode NVARCHAR(50) = 'YourInputItemCodeHere';
-- 清理baobiao临时表
IF OBJECT_ID('tempdb..#baobiao') IS NOT NULL
DROP TABLE #baobiao;
-- 创建baobiao临时表
CREATE TABLE #baobiao (
itemcode NVARCHAR(50),
itemname NVARCHAR(255),
spec NVARCHAR(255),
Material NVARCHAR(255),
itemcode2 NVARCHAR(50),
itemname2 NVARCHAR(255),
spec2 NVARCHAR(255),
Material2 NVARCHAR(255),
usr_xlccc FLOAT,
usr_xlcck FLOAT,
usr_xlccg FLOAT,
is_raw_material INT,
[level] INT
);
-- 使用递归CTE生成BOM并标记原材料
WITH BOM AS (
SELECT
p.itemid,
p.itemcode,
p.itemname,
p.spec,
p.Material,
p.usr_xlccc,
p.usr_xlcck,
p.usr_xlccg,
CAST(NULL AS INT) AS parent_itemid,
CAST(NULL AS NVARCHAR(50)) AS parent_itemcode,
CASE WHEN p.usr_xlccc IS NOT NULL OR p.usr_xlcck IS NOT NULL OR p.usr_xlccg IS NOT NULL THEN 1 ELSE 0 END AS is_raw_material,
0 AS [level]
FROM
pdmitem p
WHERE
p.itemcode = @InputItemCode
UNION ALL
-- 递归成员:获取子物料
SELECT
p.itemid,
p.itemcode,
p.itemname,
p.spec,
p.Material,
p.usr_xlccc,
p.usr_xlcck,
p.usr_xlccg,
r.objid AS parent_itemid,
b.itemcode AS parent_itemcode,
CASE WHEN p.usr_xlccc IS NOT NULL OR p.usr_xlcck IS NOT NULL OR p.usr_xlccg IS NOT NULL THEN 1 ELSE 0 END AS is_raw_material,
b.[level] + 1
FROM
pdmitem p
INNER JOIN pdmitemref r ON p.itemid = r.refobjid
INNER JOIN BOM b ON r.objid = b.itemid
)
-- 插入到baobiao临时表
INSERT INTO #baobiao (
itemcode,
itemname,
spec,
Material,
itemcode2,
itemname2,
spec2,
Material2,
usr_xlccc,
usr_xlcck,
usr_xlccg,
is_raw_material,
[level]
)
SELECT
b.itemcode,
b.itemname,
b.spec,
b.Material,
b.parent_itemcode, -- itemcode2存放父物料编码
(SELECT itemname FROM pdmitem WHERE itemcode = b.parent_itemcode) AS itemname2, -- 父物料名称
(SELECT spec FROM pdmitem WHERE itemcode = b.parent_itemcode) AS spec2, -- 父物料规格
(SELECT Material FROM pdmitem WHERE itemcode = b.parent_itemcode) AS Material2, -- 父物料材料
b.usr_xlccc,
b.usr_xlcck,
b.usr_xlccg,
b.is_raw_material,
b.[level]
FROM
BOM b
WHERE
b.parent_itemid IS NOT NULL OR b.level = 0;
-- 查询baobiao临时表的内容
SELECT * FROM #baobiao
ORDER BY [level], itemcode;
通常,当您需要对繁忙的表进行大量(或频繁)查询时,未提交事务的锁定可能会阻止已提交的读操作,但是只有当您可以容纳不正确的数据时,才可以进行此操作。
例如,在我最近工作的一个游戏网站上,摘要显示了一些有关最近游戏的统计信息,这些数据都是基于不正确的读取,对于我们来说,重要的是包括然后排除尚未提交的交易数据(无论如何,我们知道将很少(如果有的话)交易被撤消),我们认为平均而言,数据将更准确。