PDA

View Full Version : سوال: مشکل استفاده از SELECT توی حلقه WHILE



sheitoonbala
سه شنبه 12 آذر 1387, 20:31 عصر
سلام. فرض کنید توی یه کوئری 10 تا متغیر داریم به نام های p0@ و p1@ و p2@ و p3@ و .... تا p9@.
فرض کنید می خوام مقدار اینها رو تغییر بدم، ولی نمی خوام 10 بار دستور 'select @p1 = 'test رو برای تک تکشون بنویسم. می خوام توی یه حلقه while این کار رو بکنم. بصورت زیر :


DECLARE @p0 nvarchar(10)
DECLARE @p1 nvarchar(10)
DECLARE @p2 nvarchar(10)
DECLARE @p3 nvarchar(10)
DECLARE @p5 nvarchar(10)
DECLARE @p6 nvarchar(10)
DECLARE @p7 nvarchar(10)
DECLARE @p8 nvarchar(10)
DECLARE @p9 nvarchar(10)

DECLARE @i int
SET @i=0

WHILE(@i < 10)
BEGIN
EXEC ('select @p' + @i + '=''test''' )
SET @i = @i + 1
END

ولی error می ده. در واقع نمی تونه متغیرها رو انجوری توی EXEC شناسایی کنه.(حق هم داره)
کسی تا حالا همچین مشکلی داشته؟باید چه جوری کد بنویسم که بتونه متغیرها رو توی حلقه شناسایی کنه و بهشون مقدار بده؟

حمیدرضاصادقیان
چهارشنبه 13 آذر 1387, 07:47 صبح
سلام.شما ابتدا یک متغیر از نوع Varchar تعریف کنید بعد اون مقداری رو که داخل Exec نوشتید ابتدا داخل متغیری که تعریف کردید بریزید بعد با استفاده از sp_executesql اونو اجرا کنید.چون خودم اینکارو کردم.

sheitoonbala
چهارشنبه 13 آذر 1387, 13:44 عصر
ممنون آقای صادقیان. نتونستم درست از SP استفاده کنم.کد بالا رو بصورتی که گفتید تغییر دادم . ببنید :

DECLARE @p0 nvarchar(10)
DECLARE @p1 nvarchar(10)
DECLARE @p2 nvarchar(10)
DECLARE @p3 nvarchar(10)
DECLARE @p5 nvarchar(10)
DECLARE @p6 nvarchar(10)
DECLARE @p7 nvarchar(10)
DECLARE @p8 nvarchar(10)
DECLARE @p9 nvarchar(10)

DECLARE @i int
DECLARE @s nvarchar(2)
DECLARE @sql nvarchar(max)
SET @i=0

WHILE(@i < 10)
BEGIN
SELECT @s = CONVERT(nvarchar(2), @i)
SELECT @sql = 'select @p' + @s + '=''test'''
EXEC sp_executesql @sql
SET @i = @i + 1
END


ولی همون error های قبلی رو بهم داد. ظاهرا پارامتر ورودی sp هم nvarchar باید باشه،varchar قبول نمی کنه.اگه لطف کنی یه sample ساده برام بذاری یا همین sample رو درست کنی ممنون می شم.

mannai29
چهارشنبه 13 آذر 1387, 18:02 عصر
هر بلاکی که با sp_executesql یا دستورات مشابه انجام می شود مانند یک کوئری جداگانه است. بنابراین متغیر های @p شما شناخته شده نیست و error هم مربوط به همین است .
شما باید کل تعریف متغیرها و چیزهای لازم دیگر را به درون بلاک @sql ببرید.اگر کمی دقت کنید به راحتی انجامش می دهید.

حمیدرضاصادقیان
پنج شنبه 14 آذر 1387, 08:51 صبح
سلام.ببینید همونطور که دوستمون گفت باید تمامی چیزهایی که گفتی رو داخل یک متغیر varchar بریزی مثل


declare @strsql varchar(500)
set @strsql='select * from '+@p1+',...'
sp_executesql @strsql

sheitoonbala
پنج شنبه 14 آذر 1387, 15:28 عصر
سلام.ممنون از شما.نحوه استفاده از این sp رو متوجه شدم ، ولی فکر نکنم کاری که من می خوام رو این sp بتونه انجام بده.(حداقل من نتونستم).
ببنید من در اولین پست گفتم چه کاری می خوام انجام بدم. در واقع می خوام غیر مستقیم به یه متغیر دسترسی پیدا کنم. یه چیزی شبیه findControl در دات نت.
می شه sample ای رو که گذاشتم به اون صورتی که می خوام تغییر بدید؟
ممنون