PDA

View Full Version : نام فيلد بصورت متغيير



spicirmkh
پنج شنبه 26 دی 1387, 12:21 عصر
سلام

من يک SP دارم که نام فيلد متغيير است و هيچ پيغام خطا نمي گيرد اما خروجي به درستي اجرا نمي شود

کد برنامه به اين صورت است


CREATEPROCEDURE sp_PinCode
@Pin nvarchar(20)
AS
BEGIN
Declare @A nvarchar(100)
Set @A = N'dbo.users.PinCode'
SELECT dbo.Users.PinCode
FROM dbo.users
WHERE @A =RTRIM(LTRIM(@pin))
/* WHERE dbo.users.PinCode = RTRIM(LTRIM(@pin)) */
END
GO



ضمنا دستور TREM چرا در SP عمل نمي کند

با تشکر

mannai29
یک شنبه 29 دی 1387, 09:15 صبح
روش ارسال نام فیلد شما به صورت متغیر درست نیست چون در

SELECT dbo.Users.PinCode
FROM dbo.users
WHERE @A =RTRIM(LTRIM(@pin))

@A به صورت متغیر دیده می شود نه نام فیلد. شما باید کل SELECT را در رشته قرار دهید و نام فیلد را هم در رشته قرار دهید مانند :


Declare @A nvarchar(100)
Declare @str nvarchar(100)
Set @A = N'id'
set @str='select * from TBL where '+@A+'=1'
exec sp_executesql @str

دستور TREM هم در T-SQL وجود ندارد. اگر منظورتان TRIM هست آن هم همینطور.

spicirmkh
دوشنبه 30 دی 1387, 08:33 صبح
سلام

من برنامه بصورت زبر تغيير دادم


CREATEPROCEDURE sp_Test
@Pin nvarchar(20)
AS
BEGIN
Declare @str nvarchar(100)
Declare @A nvarchar(100)
Set @A = N'PinCode'
set @str='SELECT * FROM users where '+@A+'='+@pin
execsp_executesql @str
END
GO


هنگام اجرا SP پيغام زير مي دهد فرض کنيم به pin عدد 123 مي دهيم


Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value 'a' to data type int.

حال وقتي به pin مقدار ali مي دهيم اين پيغام مي دهد


Msg 207, Level 16, State 1, Line 1
Invalid column name 'ali'.


ضمنا در SP من دستور Trim دادم اين پيغام خطا داد

'Trim' is not a recognized built-in function name.



با تشکر

mannai29
دوشنبه 30 دی 1387, 08:54 صبح
فیلد PinCode احتمالا از نوع رشته ای است ، و هنگام پیوستن @pin به رشته @str در دو طرفش سینگل کوتیشن قرار نمی گیرد و آنگاه وقتی شما 123 را پاس میدهید یک مقدار عددی را با رشته مقایسه می کند و هنگامی که ali را پاس می کنیدباز به چشم یک فیلد می بیند که در هیچ جدولی نیست.

شما باید '123' و 'ali' را پاس کنید بنابراین یا باید مقدار @pin را این گونه ارسال کنید یا این خط را این گونه بنویسید:



set @str='SELECT * FROM users where '+@A+'='''+@pin+''''



مورد آخر هم در T-SQL وجود ندارد.

spicirmkh
دوشنبه 30 دی 1387, 18:25 عصر
سلام

ممنونم از جوابتان برنامه بدرستي اجرا شد

سوالي که پيش مي آيد قبل pin@ شما 2 تا سینگل کوتیشن گذاشتيد و بعد از pin@ 4 تا سینگل کوتیشن آيا از نظر برنامه نويسي نبايد 3 تا باشد .

سوال دوم آيا مي شود هنگام اجرا يک sp مرحله به مرحله اجرا کرد و بتوانيم برنامه ديباگ کنيم

با تشکر

mannai29
سه شنبه 01 بهمن 1387, 09:10 صبح
سلام
برای اینکه درون یک رشته در T-SQL یک سینگل کوتیشن بگذاریم باید از دوتا سینگل کوتیشن کنار هم استفاده کنیم . بنابراین در '''' دو تای اولی و آخری مربوط به رشته و دوتای وسطی مربوط به تشکیل یک سینگل کوتیشن است. در سمت چپ @pin هم همینطور است : '='''.

اما برای سوال دوم اگر منظورتان دیباگ کردن یک پروسیجر هست در SQL Server 2008 این امکان مانند محیط برنامه نویسی برای کد نویسان فراهم شده است . یعنی می توانید کدها را خط به خط اجرا کنید .
در ورژن های پایین تر هم من تاکنون سعی کردم از روش های خلاقانه استفاده کنم. مثلا در مورد بالا می توانید پیش از اجرای sp_executesql @str دستور print @str بنویسید تا ببینید که @str شما درست ساخته شده یا نه.

spicirmkh
پنج شنبه 03 بهمن 1387, 10:44 صبح
سلام
ممنونم از ارسال پاسخ
من SQl 2005 استفاده مي کنم روش خط به خط ارا کردت برنامه يعني sp و ببينيم مثلا اين متغيير چه مقداري دارد چگونه است

با تشکر