SQL Server函数里面有一个Select语句和事务死锁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server函数里面有一个Select语句和事务死锁相关的知识,希望对你有一定的参考价值。
使用下面显示的代码我得到一个事务死锁。 Split
函数接受一个字符串并将列表拆分为一个表格,我在其中进行选择。我的活动有READ UNCOMMITTED
。我应该将Split
放入临时表中,然后用它进行查询吗?
ALTER PROCEDURE [Revisions]
@ScheduleRevisionIds NVARCHAR(MAX) = NULL
AS
BEGIN
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
IF(@ScheduleRevisionIds IS NOT NULL)
BEGIN
-- GET SCHEDULE REVISIONS
SELECT esr.Id
INTO #TempScheduleRevisions
FROM Revision esr
WHERE EXISTS (SELECT items
FROM dbo.Split(@ScheduleRevisionIds, ',')
WHERE esr.Id = items)
功能
ALTER FUNCTION [Split](@String varchar(MAX), @Delimiter char(1))
returns @temptable TABLE (items varchar(MAX))
as
begin
declare @idx int
declare @slice varchar(MAX)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
SET @String = right(@String, LEN(@String) - @idx)
IF LEN(@String) = 0 BREAK
END
RETURN
END
答案
我没有任何具体的说法查询的任何部分会导致事务死锁。但是,我认为你可以使用我觉得更简单的JOIN,可能会让你摆脱麻烦的僵局。所以,试试这个:
SELECT esr.Id INTO #TempScheduleRevisions
FROM
Revision esr
INNER JOIN
dbo.Split(@ScheduleRevisionIds, ',') sri
ON
sri.items = esr.id
以上是关于SQL Server函数里面有一个Select语句和事务死锁的主要内容,如果未能解决你的问题,请参考以下文章
SQL SERVER里面的with语句有啥作用?用过的师兄请帮忙
如何在 Sql Server Compact Edition SELECT 语句中复制 Rank 函数?