我有以下内容的商店程序:
Create PROC A
(
@param1 varchar(50) = NULL
,@param2 varchar(50) = NULL
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
UPDATE [dbo].[MyTable1]
SET [Status] = 1
,[UpdatedUser] = 'My Update'
,[UpdatedDate] = getdate()
WHERE (ISNULL(@param1 ,'') = '' OR param1 = @param1 )
AND (ISNULL(@param2 ,'') = '' OR param2 = @param2 )
UPDATE [dbo].[MyTable2]
SET [col1] = 'info 1'
,[UpdatedUser] = 'My Update'
,[UpdatedDate] = getdate()
WHERE TableCode IN (
SELECT [TableCode]
FROM [MyTable1] WITH(NOLOCK)
WHERE (ISNULL(@param1 ,'') = '' OR param1 = @param1 )
AND (ISNULL(@param2 ,'') = '' OR param2 = @param2 )
)
SELECT 1
END TRY
BEGIN CATCH
SELECT -1
END CATCH
END
我调用store时有很多错误死锁,主要原因是语句2中where子句中的可预测表MyTable1调用。所以,我不知道
NOLOCK
是否真的在应用?请解释。
我尝试将语句 2 与语句 1 交换,以确保在使用 MyTable1 更新操作之前选择调用
它可能适合你
UPDATE [dbo].[MyTable2]
SET [col1] = 'info 1'
,[UpdatedUser] = 'My Update'
,[UpdatedDate] = getdate()
WHERE TableCode IN (
SELECT [TableCode]
FROM [MyTable1] WITH(NOLOCK)
WHERE (ISNULL(@param1 ,'') = '' OR param1 = @param1 )
AND (ISNULL(@param2 ,'') = '' OR param2 = @param2 )
);
UPDATE [dbo].[MyTable1]
SET [Status] = 1
,[UpdatedUser] = 'My Update'
,[UpdatedDate] = getdate()
WHERE (ISNULL(@param1 ,'') = '' OR param1 = @param1 )
AND (ISNULL(@param2 ,'') = '' OR param2 = @param2 ) ;
SELECT 1
END TRY
BEGIN CATCH
SELECT -1
END CATCH
你需要使用;分号。这是在数据库系统中分隔每个 SQL 语句的标准方法,允许在对服务器的同一调用中执行多个 SQL 语句