Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 动态查询中的TSQL隔离级别_Sql Server_Tsql_Isolation Level - Fatal编程技术网

Sql server 动态查询中的TSQL隔离级别

Sql server 动态查询中的TSQL隔离级别,sql-server,tsql,isolation-level,Sql Server,Tsql,Isolation Level,存储过程中指定的隔离级别是否会执行该存储过程中的动态查询 CREATE PROCEDURE MySP AS BEGIN SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED DECLARE @dSQL VARCHAR(max) = 'SELECT col FROM table'; EXEC(@dSQL); END 那么,动态查询中的隔离级别是什么呢?它会执行动态查询,您可以使用以下内容进行检查: DBCC useroptions; SET TRA

存储过程中指定的隔离级别是否会执行该存储过程中的动态查询

CREATE PROCEDURE MySP AS 
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @dSQL VARCHAR(max) = 'SELECT col FROM table';
EXEC(@dSQL);
END

那么,动态查询中的隔离级别是什么呢?

它会执行动态查询,您可以使用以下内容进行检查:

DBCC useroptions;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @dSQL VARCHAR(max) = 'DBCC useroptions';
EXEC(@dSQL);

我相信你有隔离级别。我做了这个测试,在动态查询中得到了隔离级别1

-- Create the SP (my test is on AdventureWorks2012)
CREATE PROCEDURE MySP AS 
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @dSQL VARCHAR(max) = 'SELECT * FROM Person.Person; WAITFOR DELAY ''02:00'';';
EXEC(@dSQL);
END

-- Exec SP
EXEC MySP

-- Check the isolation level while your dynamic code is running
SELECT transaction_isolation_level, * FROM sys.sysprocesses t1
JOIN sys.dm_exec_requests t2 on t1.spid = t2.session_id
WHERE t1.spid > 50

通常情况下,
SET
语句不仅仅是
事务隔离级别
SET
语句是会话级别,因此可以执行到子进程。但是,虽然可以在子流程中更改,但这些更改不会带回调用/父上下文

有关更多详细信息,请参见MSDN页面

通过执行以下操作,您可以轻松测试这一点:

SSMS查询选项卡1:

-- DROP TABLE ##tmp;
CREATE TABLE ##tmp (Col1 INT);
INSERT INTO ##tmp (Col1) VALUES (1);

BEGIN TRAN
SELECT * FROM ##tmp WITH (HOLDLOCK, TABLOCKX);
WAITFOR DELAY '00:02:00.000'; -- 2 minute timer
ROLLBACK TRAN;
-- First, highlight the following and run. It will hang. Cancel the query.
-- SELECT * FROM ##tmp;

-- Second, hit F5. It will return the row twice.
-- If the SET command in the EXEC affected the parent process, the 2nd SELECT
-- would hang.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

EXEC (N' SELECT * FROM ##tmp; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;');

SELECT * FROM ##tmp;
SSMS查询选项卡2:

-- DROP TABLE ##tmp;
CREATE TABLE ##tmp (Col1 INT);
INSERT INTO ##tmp (Col1) VALUES (1);

BEGIN TRAN
SELECT * FROM ##tmp WITH (HOLDLOCK, TABLOCKX);
WAITFOR DELAY '00:02:00.000'; -- 2 minute timer
ROLLBACK TRAN;
-- First, highlight the following and run. It will hang. Cancel the query.
-- SELECT * FROM ##tmp;

-- Second, hit F5. It will return the row twice.
-- If the SET command in the EXEC affected the parent process, the 2nd SELECT
-- would hang.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

EXEC (N' SELECT * FROM ##tmp; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;');

SELECT * FROM ##tmp;
请参阅:-您可以使用类似的代码对动态sql进行测试。