PDA

View Full Version : سوال: ارسال نام جدول از طریق پارامتر به SP



heartshunter
یک شنبه 17 شهریور 1387, 22:13 عصر
من یه sp دارم که کار insert تو یه جدول رو انجام میده
آیا من میتونم اسم جدول هم رو با پارامتر ارسال کنم چون میخوام کار آرشیو سازی رو ماهانه انجام بدم

yasercomeng
دوشنبه 18 شهریور 1387, 05:21 صبح
فكر نكنم كاري بشه كرد تلاش هاي منم براي اين موضوع كاملاً بي نتيجه بود چه تو اين سايت چه تو سايت هاي خارجي الان يه دو ماهي ميگذره كه من پستمو تو بعضي از سايت هاي معروف گذاشتم اما حتي هيچ كس نگفته كه آيا اين كار ممكنه يا نه؟
در هر صورت اگه خبري شد به ما هم بگو.

fbayanati
دوشنبه 18 شهریور 1387, 08:51 صبح
Sorry to write in English

In my opinion, may be you need to redesign your application, it's not a good approach to send table for a store procedure, anyway you need to code Dynamic SQL, I don't have any idea about your tables structure, then let me just bring a general example:


USE AdventureWorksLT

CREATE PROCEDURE getName
@tblname sysname,
@key varchar(10)
AS
BEGIN
DECLARE @sql nvarchar(4000)
SELECT @sql = ' SELECT FirstName, LastName ' +
' FROM ' + @tblname +
' WHERE CustomerID = @key'
EXEC sp_executesql @sql, N'@key varchar(10)', @key
SELECT @key
END

DECLARE @myTbl sysname, @myKey INT
SET @myTbl = 'SalesLT.Customer'
SET @myKey = 10
SELECT @myTbl, @myKey
EXEC getName @myTbl, @myKey

Hope that helps

heartshunter
دوشنبه 18 شهریور 1387, 10:08 صبح
راستش زیاد سر در نیاوردم میشه بیشتر توضیح دهید

heartshunter
دوشنبه 18 شهریور 1387, 15:09 عصر
من یه sp دارم که کار insert تو یه جدول رو انجام میده
آیا من میتونم اسم جدول هم رو با پارامتر ارسال کنم چون میخوام کار آرشیو سازی رو ماهانه انجام بدم

کسی تا حالا همخین کاری انجام نداده ؟؟ :متعجب:
یه کمکی کنید کارم لنگه :ناراحت:

greateprogrammer
سه شنبه 19 آذر 1387, 11:29 صبح
سلام

دوست عزیز شاید این کارتو راه بندازه .


declare @tblname varchar(20)
set @tblname='tblcountry'
DECLARE @sql nvarchar(4000)
SELECT @sql = ' SELECT * ' +
' FROM ' + @tblname
EXEC sp_executesql @sql

ar.shirazi
سه شنبه 19 آذر 1387, 14:05 عصر
تا جایی که خودم یکبار تست کردم، راه حل این است که نام جدول را به صورت کاراکتر ارسال کنید و سپس کوئری مورد نظر را به صورت کاراکتری ساخته و از EXEC استفاده کنید و آن را اجرا کنید.

شبیه به این :




declare @sql varchar(max)
select @sql = 'select * from [' + @TableName + ']'
exec (@sql)


نکته : کد بالا و کدهایی شبیه به این شدیدا مستعد حملات sql injection هستند. در این مورد مراقب باشید

-----------------------------------------------

اگر (!! ) میشد کاری شبیه به این کرد بسیار جالب می بود: (این مورد را تست نکرده ام)






declare @tblname varchar(20)

SELECT * FROM
(select TOP(1) * from sysobjects where type = 'U' and name=@tblname )


باز هم عرض میکنم که راه بالا جای تست و بررسی دارد که اگر فرصت شد آن را تصحیح میکنم

ar.shirazi
سه شنبه 19 آذر 1387, 14:06 عصر
سلام

دوست عزیز شاید این کارتو راه بندازه .


declare @tblname varchar(20)
set @tblname='tblcountry'
DECLARE @sql nvarchar(4000)
SELECT @sql = ' SELECT * ' +
' FROM ' + @tblname
EXEC sp_executesql @sql

دوست گرامی
این دستور کار نخواهد کرد.
با احترام

AminSobati
سه شنبه 19 آذر 1387, 16:21 عصر
سلام به همه دوستان،
استفاده از یک SP عمومی (که قائدتا Dynamic TSQL هم خواهد بود) چندین عیب فنی داره که از نظر عموم برنامه نویسها پوشیده است (از جمله SQL Injection، به هدر دادن حافظه سرور، Recompileهای متعدد و ...).
جز در موارد خاص و قابل توجیه، چنین کاری توصیه نمیشه. در دیتابیسهایی که اصولی طراحی میشن، هر جدول حداقل سه SP برای ویرایش خواهد داشت. از داشتن SPهای زیاد نگران نباشید!