开发者社区 问答 正文

SQL Server

为什么我应该或不应该使用脏读:

set transaction isolation level read uncommitted

在SQL Server中?

展开
收起
心有灵_夕 2019-12-25 21:33:36 889 分享 版权
2 条回答
写回答
取消 提交回答
  • 练习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;

    2024-05-15 17:31:23
    赞同 展开评论
  • 通常,当您需要对繁忙的表进行大量(或频繁)查询时,未提交事务的锁定可能会阻止已提交的读操作,但是只有当您可以容纳不正确的数据时,才可以进行此操作。

    例如,在我最近工作的一个游戏网站上,摘要显示了一些有关最近游戏的统计信息,这些数据都是基于不正确的读取,对于我们来说,重要的是包括然后排除尚未提交的交易数据(无论如何,我们知道将很少(如果有的话)交易被撤消),我们认为平均而言,数据将更准确。

    2019-12-25 21:33:53
    赞同 展开评论
问答标签:
问答地址: