5

プロシージャを保存しました:

ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE]

@cartGUID nvarchar

AS

DELETE FROM
  [dbo].[k_ShoppingCart]
WHERE
  CartGUID = @cartGUID

これを実行すると、

exec dbo.k_ShoppingCart_DELETE '32390b5b-a35a-4e32-8393-67d5629192f0'

結果:0行が影響を受けました。

しかし、私がこのクエリを試してみると:

Delete FROM k_ShoppingCart Where CartGUID = '32390b5b-a35a-4e32-8393-67d5629192f0'

結果:2行が影響を受けました。

これの何が問題になっていますか?

4

7 に答える 7

4

UNIQUEIDENTIFIER の代わりに NVARCHAR を使用することを主張する場合は、サイズを指定する必要があります。

@cartGUID nvarchar(36)

これがないと、GUID が切り捨てられます ( 30 文字まで)。

この動作を確認するには、作業クエリの次の修正版を実行します。

DECLARE @cart nvarchar, @sizedcart nvarchar(36)
SET @cart      = '32390b5b-a35a-4e32-8393-67d5629192f0'
SET @sizedcart = '32390b5b-a35a-4e32-8393-67d5629192f0'

-- works
Delete FROM k_ShoppingCart Where CartGUID = '32390b5b-a35a-4e32-8393-67d5629192f0'

-- will not work
Delete FROM k_ShoppingCart Where CartGUID = @cart

-- should work
Delete FROM k_ShoppingCart Where CartGUID = @sizedcart

私は@Marc Gravellに同意しますが、uniqueidentifierがここに行く方法です。

于 2009-01-31T19:22:03.997 に答える
3

ではなく@cartGUID_ _ すべての guid を varchar にキャストし、同じ形式を使用することを期待するよりも、単一の varchar を guid にキャストして guid を比較する方が効率的です (そうしないと、いずれにせよ同等性は失敗します)。uniqueidentifiernvarchar

他の人が指摘しているように、WHERE句はファンキーに見えますが、私のお金は varchar 変換が原因です。

于 2009-01-31T18:43:26.960 に答える
0

複数のスキーマの下に同じテーブルがあるとは思いません...

dbo.k_ShoppingCart

vs.

user1.k_ShoppingCart

アドホッククエリが現在のユーザー参照を使用している間、ストアドプロシージャは「dbo」を使用しています。

于 2009-01-31T19:04:06.573 に答える
0

私には奇妙に見えるもう1つのこと:cartIDがGUID(および一意の識別子)である場合、削除ステートメントが2つの行に影響するのはなぜですか?

また、cartIDの定義に長さを追加してみてください。ファンキーなデフォルトの長さの定義により、入力パラメーターが短縮されたり、空白などで埋められたりする可能性があります。

于 2009-01-31T19:18:01.913 に答える
0

あなたのストアド プロシージャ SQL は少し奇妙に思えます。正しくコピーしましたか?

正直なところ、これはコンパイルされるようには見えません。

WHERE
  CartGUID =@cartGUID

in (Select
于 2009-01-31T18:41:22.720 に答える
0

ストアド プロシージャの最後にある IN ステートメントは何ですか? 意味がありません。それを取り除くだけです。また、クエリと sproc ですべてのテーブルの前に「dbo」を付けます (デフォルト スキーマに同じテーブルの別のバージョンがあるかもしれません)。これら2つのことを行うと、うまくいくはずです。

于 2009-01-31T18:42:49.113 に答える
0

私はそれを解決しました。

解決策: ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE]

@cartGUID nvarchar (50)

于 2009-01-31T19:49:52.940 に答える