12

で T-SQL クエリを書いているときにNOEXEC ON、SQL Server の興味深い動作を経験したので、なぜそうなったのか興味があります。時々私はただ得た

コマンドが正常に実行されました。

メッセージは期待どおりですが、1 つまたは複数のメッセージが表示されることもありました

(影響を受ける行はありません)

メッセージ。

コマンドはクエリをコンパイルしますが、実行しないことを知っているSET NOEXEC ONので、何も取得すべきではないと思います

(影響を受ける行はありません)

メッセージ。

最初の例では、すべてが正常に見えます。

SET NOEXEC ON
INSERT INTO Test (column1) VALUES ('etc')

結果:

コマンドが正常に実行されました。

しかし、2番目の例では、何かがおかしいと思います...

SET NOEXEC ON
DELETE FROM Test

結果:

(影響を受ける行はありません)

3 番目の例では、一時テーブルを使用しました。

CREATE TABLE #tmp (id INT IDENTITY(1, 1), idX INT)

SET NOEXEC ON
INSERT INTO #tmp (idX) VALUES (1)
DELETE FROM Test

SET NOEXEC OFF
DROP TABLE #tmp

結果:

(影響を受ける行はありません)

最後にGO、クエリにのみ追加しました。結果は興味深いと思います

CREATE TABLE #tmp (id INT IDENTITY(1, 1), idX INT)
SET NOEXEC ON
GO

INSERT INTO #tmp (idX) VALUES (1)
DELETE FROM Test

SET NOEXEC OFF
DROP TABLE #tmp

結果:

(影響を受ける行はありません)

(影響を受ける行はありません)

4

2 に答える 2

2

Although this might not be the answer to your question:

But when you delete

SET NOEXEC ON 
DELETE FROM Test 

If you add a where condition to the DELETE STATEMENT like DELETE FROM Test WHERE COLUMN1='etc'

You will get the desired results...This behavior may be because of DDL and DML statements we executed.

I have also analyzed the third situation where in if you insert in temporary table it gives you (0 rows Affected) but if the same insert is on some database or permanent table is done it gives (Command(s) completed successfully.)

Here it might be because of temp table and permanent table.

For the 4th one you have added a GO :

GO will execute the related sql commands n times.

So if you individually execute the insert statement and the delete statement both has some return value and GO is adding them in batch plan.

于 2012-05-15T04:40:58.827 に答える
1

SQl Server 2005 および 2008 で動作を再現するので、R2 だけではなく、insert で発生するのと同じことが update ステートメントでも発生するため、delete は例外のようです。Truncate (これはほとんど削除です) でさえ、標準メッセージを取得します。

また、SQL Server Management Studio の問題である可能性も考えましたが、別のツールでテストし、SQLCMD で実行したところ、同じ動作が見られました。

ここに画像の説明を入力

「コマンドは正常に実行されました」を除いて。メッセージが表示されない (これは SSMS だけのものでなければなりません)

とにかく、私は説明できませんが、推測することはできます。私は、削除ステートメントが Insert と Update がしない他のこと (またはそれ以下) を行うために起こると思います。コンパイル プロセスは、解析、正規化、コンパイル、最適化の 4 つの部分に分かれています。これらのステップ内の何かが削除ステートメントによって異なる方法で行われると想定しているため、異なる結果が得られます

于 2012-05-16T12:24:06.277 に答える