PDA

View Full Version : مقایسه مقادیر با NULL



mohammadjp
شنبه 11 دی 1389, 00:05 صبح
UPDATE TestD
SET TestId = @TestId
WHERE (TestId = @OldTestId )

در کوئری update بالا اگر مقدار پارامتر @OldTestId برابر NULL باشد برخلاف تصور من رکوردهائی که مقدار فیلد TestIdانها برابر NULL باشند انتخاب نمیشوند و OFF یا ON بودن SET ANSI_NULLS نیز کمکی نکرد
لطفا راهنمائی کنید

sasan_vm
شنبه 11 دی 1389, 01:34 صبح
WHERE TestId IS NULL

mohammadjp
شنبه 11 دی 1389, 10:08 صبح
البته اگر فقط بخواهم با NULL مقایسه کنم ولی من میخواهم هم با مقدار وهم با NULL نتیجه شرط منطقی باشد فعلا من از روش زیر استفاده کرده ام ولی میدانم این روش در اینده مشکل ساز خواهد شد.
WHERE TestId = @OldTestId OR TestId IS NULL

pezhvakco
شنبه 11 دی 1389, 11:54 صبح
زمانی که می خواهیم داده یک ستون را با مقدار هیچ (Null) برابری بدیم چون Null مقدار نداره نمیشه علامت " = " رو بکار برد و باید " Is " رو بکار بگیریم .

این کد :

WHERE TestId = @OldTestId OR TestId IS NULL

میخواهم هم با مقدار وهم با NULL نتیجه شرط منطقی باشد
چون با Or (یا) اومده در دو نوع ردیف ها را مشخص می کنه : 1 - اون هایی که داده ستون TestId برابر پارامتر ورودی است 2- ستون TestId برابر Null است .
که فکر کنم این یکم مشکل داشته باشه چون در اولین باری که دستور اجرا بشه همه ستون های که TestId برابر Null است مقدارشون برابر با مقدار پارامتر ورودی میشه و دیگه هیچ ستونی مقدار null نخواهد داشت .

mohammadjp
شنبه 11 دی 1389, 13:30 عصر
میخواهم هم با مقدار وهم با NULL نتیجه شرط منطقی باشد
منظورم این بود که در زمان اجرا معین نیست مقدار پارامتر ارسالی NULL یا مقداری حقیقی است بنابراین = یا is به طور کامل جوابگو نیست

حمیدرضاصادقیان
شنبه 11 دی 1389, 13:40 عصر
سلام.شما چطوری مقدار NULL رو به Query ارسال میکنید؟؟؟
NULL مقداری نیست که بخواهید ارسال کنید.
شما صورت مسئله رو دقیقتر توضیح بدید.
ببینید وقتی شما OR به کار می برید در صورتی که شرط اول یا دوم برقرار باشه دستور شما اجرا میشه و این شاید شمارو دچار مشکل کنه.
شاید بهتر باشه قبلش با یک If مقدار ورودی رو کنترل کنید و Query رو به صورت Dynamic بسازید.

mohammadjp
شنبه 11 دی 1389, 14:47 عصر
سلام

NULL مقداری نیست که بخواهید ارسال کنید.
در حقیقت اطلاعات من درون یک دیتا گرید ویوی است که توسط اپراتور پر شده و بعضی از خانه ها خالی رها شده وقتی کامندهای مربوط به insert update delete select پارامترهای خود را میگیرند، پارامترهای مرتبط با خانه های خالی مقدار NULL را به command پاس میکنند

تعداد این پارامترها که مقدار NULL را نیز ممکن است داشته باشند 5-6 تا است که ساخت کوئری دینامیک را کمی سخت میکند
در help sql در مورد SET ANSI_NULLS نوشته که باید off باشد تا نتایج مقایسه با NULL درست تعبیر شود ولی من نتیجه مورد نظر را نگرفتم

حمیدرضاصادقیان
شنبه 11 دی 1389, 15:07 عصر
سلام.اگر قبل از کوئری این دستور رو اجرا کنید و شرط رو با = تست کنید نباید به مشکلی بربخورید.
آیا خطایی دریافت میکنید.؟

mohammadjp
شنبه 11 دی 1389, 15:14 عصر
دقیقا قبل از اجرای کوئری عبارت SET ANSI_NULLS OFF را قرار داده ام و پیغام خطائی هم دریافت نمیکنم و رکوردهائی که فیلد مورد نظرم NULL است هنگام مقایسه با NULL انتخاب نمیشوند

حمیدرضاصادقیان
شنبه 11 دی 1389, 15:24 عصر
آیا بعد از این دستور از Go استفاده کردید؟

حمیدرضاصادقیان
شنبه 11 دی 1389, 15:49 عصر
سلام.
دوست عزیز این دستور نباید درون Stored Procedure باشه چون عمل نخواهد کرد.شما باید قبل از ایجاد Procedure این دستور رو اجرا کنید بعد Procedure رو ایجاد کرده دوباره اونو غیر فعال کنید.
برای اینکار متن Procedure رو داخل Query Analyzer ریخته و Procedure رو حذف کنید.سپس قبل از ایجاد این دستور رو Off کنید بعد Procedure رو ایجاد کنید.

mohammadjp
شنبه 11 دی 1389, 16:20 عصر
همانگونه که شما اشاره کردید مقدار ANSI_NULLS باید قبل از ساخته شده استور پروسیجر OFF شود زیرا مقدار ANSI_NULLS استور پروسیجرها هنگام اجرا برابر مقدار آن در لحظه ساخته شدن استور پروسیجر است

Reza_Yarahmadi
شنبه 11 دی 1389, 17:02 عصر
تا جايي كه ميدونم از سمت برنامه به اين صورتي كه شما گفتيد نميشه NULL فرستاد معمولا '' (2 تك كتيشن) ارسال ميشه يه اين معني كه NULL نيست ولي متني هم درش وجود نداره، با تريس كردن كد ببينيد چه مقدار داره ارسال ميشه ، براي اطمينان بيشتر كدتون رو بصورت زير تغيير بديد

SET ANSI_NULLS OFF
ALTER PROCEDURE [dbo].[SpinningOEProductionDUpdate]
...
AS
if (ISNULL(@OldTestId, '') = '') Set @OldTestId = NULL
...

mohammadjp
چهارشنبه 10 خرداد 1391, 16:04 عصر
متاسفانه امروز با نکته جدیدی در مورد NULL اشنا شدم که بد نیست دیگران هم بدانند
SET ANSI_NULLS ON affects a comparison only if one of the operands of the comparison is either a variable that is NULL or a literal NULL.
If both sides of the comparison are columns or compound expressions, the setting does not affect the comparison.

حمیدرضاصادقیان
چهارشنبه 10 خرداد 1391, 16:43 عصر
بله.شما نمیتونید دوتا مقدار Null رو باهم مقایسه کنید.به خاطر اینکه مقداری نیستند که هنگام مقایسه بهتون نتیجه برابر بدهند و روی نتایج Query شما تاثیر خواهند گذاشت.به همین خاطر پیشنهاد میشه از تابع isnull استفاده کنید یا حتی المقدور برای فیلدها Default تعریف کنید که اگر مقداری نداشت از مقدار Default استفاده کند.

aftabgarmabakhsh
شنبه 13 خرداد 1391, 14:13 عصر
UPDATE TestD
SET TestId = @TestId
WHERE (isnull(TestId,0) = isnull(@OldTestId,0) )