PDA

View Full Version : سوال: مشکل با دستور [EXEC[ute



mnsh87
سه شنبه 10 شهریور 1388, 09:12 صبح
من اگه بخام یک متغیر رشته ای را با دستور exec اجرا کنم یه مشکل دارم فرض کنید متغیر رشته ای مثال زیر است

(declare @p nvarchar(200
set @p='select * from table where column='+@column

exec(@p)

حالا مشکل اینه که نوع column@ ، عبارتست از nvarchar ولی این دستور اجرا نمیشه
ولی اگه از نوع int باشه جواب میده .
من این دستور رو چجوری باید بنویسم تا اجرا بشه؟
ممنون

arman_Nasrollahi
سه شنبه 10 شهریور 1388, 09:45 صبح
با سلام
فکر می کنم داری یه اشتباه دیگه می کنی چون دستوری که نوشتی دورسته من برات یه نمونه دیگه هم منویسم:

DECLARE @STr NVARCHAR(MAx)

DECLARE @a Nvarchar(50)

SET @a = 2

SET @Str = 'SELECT * FROM SCH.TBL_Maghta WHERE Mag_Id = ' + @a (+@a)

EXEC(@Str)


اما اگر a@ از نوع int باشه باید به شکل زیر بنویسی

DECLARE @STr NVARCHAR(MAx)

DECLARE @a INT
SET @a = 2

(SET @Str = 'SELECT * FROM SCH.TBL_Maghta WHERE Mag_Id = ' +CONVERT(Nvarchar,@a

EXEC(@Str(

mnsh87
سه شنبه 10 شهریور 1388, 10:24 صبح
این چیزی که شما میگی رو میدونم.
ولی اجرا نمیشه .من خیلی بهش ور رفتم ولی جواب نداد .نمیدونم گیرش کجاس...

محمد سلیم آبادی
سه شنبه 10 شهریور 1388, 12:15 عصر
طبیعی که درست اجرا نشود، شما برای اینکه یک ستون رشته ای را با یک مقدار ثابت رشته ای مقایسه کنید از کاراکتر های کوتیشن (نقل قول استفاده می کنید)

مثلا انتظار نداری که این query جواب بدهد

SELECT * FROM table_1 WHERE col1=alireza

ولی انتظار داریم که این query اجرا شود:

SELECT * FROM table_1 WHERE col1='alireza'

خب حالا باید چی کار کرد، نگران نباش می توانی از تابع نقل قول استفاده کنی به کد زیر نگاه کنید:




declare @p nvarchar(200)
set @p='column_data'

set @p='select * from table where column= '+Quotename(@p,'''')

exec(@p)

mnsh87
سه شنبه 10 شهریور 1388, 12:38 عصر
من اینو تست کردم ولی جوابی که میده نادرسته ولیست header ها رو بر میگردونه
مطمئنید همین جوریه؟

محمد سلیم آبادی
سه شنبه 10 شهریور 1388, 12:55 عصر
حالا حد اقل یک مرحله توسعه پیدا کرد! قبلا header هم نشون نمی داد حالا نشون میده. این که تعداد سطری که برگرشت داده می شود برابر با صفر است به query و مقادیر جدولتان وجود دارد.
لطفا داده و کدی که اجرا می کنید را پست کنید ببینم مشکل از کجاست.

mnsh87
سه شنبه 10 شهریور 1388, 13:11 عصر
کدی که من استفاده میکردم همون کدیه که اول کار گفتم.که جواب نمیداد
بعد کدی که شما داده بودید رو امتحان کردم که گفتم چجوری میشه
داده جدول از نوع (nvarchar(50 هست.

محمد سلیم آبادی
سه شنبه 10 شهریور 1388, 13:22 عصر
آیا مقادیر موجود در ستون مربوطه شامل کاراکتر های فارسی هستند یا اینکه می خواهید بر اساس یک مقدار فارسی در جدول جستجو کنید؟ اگر اینطوری است باید از کاراکتر N قبل از رشته ها استفاده کنید .

راجب به مطمئن بودن، آخه چیزی نیست که بخواهم مطئمن باشم یا نباشم به چاپ مقدار رشته ای نگاه کن:


declare @p nvarchar(200)
set @p='column_data'

set @p='select * from table where column= '+Quotename(@p,'''')
print @p
/*select * from table where column= 'column_data'*/

mnsh87
سه شنبه 10 شهریور 1388, 13:33 عصر
بله فارسی هستن
من N اظافه کردم
declare @p nvarchar(200)
set @p=N'column_data'

set @p='select * from table where column=N'+Quotename(@p,'''')
print @p

ولی همون طور که میبینید دو جا N رو اظافه کردم
ممنون

arman_Nasrollahi
سه شنبه 10 شهریور 1388, 13:45 عصر
ممکنه عیب از حروفی مثل "ی" و یا "ک" باشه که برات نتیجه درست بر نمی گردونه !!
در ضمن می تونی از LIKE و N استفاده کنی




DECLARE @p Nvarchar(MAX)
SET @p = 'SELECT * FROM emp WHERE fname LIKE N''%' + @Fname + '''%'
EXEC(@p)

علیرضا مداح
سه شنبه 10 شهریور 1388, 15:49 عصر
سلام دوست عزیز،
البته توصیه می شود که به جای دستور EXECUTE یا EXEC از sp_executesql (http://msdn.microsoft.com/en-us/library/ms188001.aspx) استفاده نمایید تا:
1)بتوانید کوئری های Parametrized را اجرا نمایید که تا حدودی از حملات SQL Injection جلوگیری می کند،
2)با مشکلات الحاق رشته ها نیز مواجه نشوید(در صورت بهره گیری از Parametrized Query)،
3)Performance بهتری حاصل شود، چون Query Optimizer یک Execution Plan در بار اول اجرای آن ایجاد کرده و در صورتی که تنها مقدار پارامتر ها تغییر کند، از آن استفاده خواهد کرد،
4)...،/