من یه sp دارم که کار insert تو یه جدول رو انجام میده
آیا من میتونم اسم جدول هم رو با پارامتر ارسال کنم چون میخوام کار آرشیو سازی رو ماهانه انجام بدم
من یه sp دارم که کار insert تو یه جدول رو انجام میده
آیا من میتونم اسم جدول هم رو با پارامتر ارسال کنم چون میخوام کار آرشیو سازی رو ماهانه انجام بدم
فكر نكنم كاري بشه كرد تلاش هاي منم براي اين موضوع كاملاً بي نتيجه بود چه تو اين سايت چه تو سايت هاي خارجي الان يه دو ماهي ميگذره كه من پستمو تو بعضي از سايت هاي معروف گذاشتم اما حتي هيچ كس نگفته كه آيا اين كار ممكنه يا نه؟
در هر صورت اگه خبري شد به ما هم بگو.
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
راستش زیاد سر در نیاوردم میشه بیشتر توضیح دهید
سلام
دوست عزیز شاید این کارتو راه بندازه .
declare @tblname varchar(20)
set @tblname='tblcountry'
DECLARE @sql nvarchar(4000)
SELECT @sql = ' SELECT * ' +
' FROM ' + @tblname
EXEC sp_executesql @sql
تا جایی که خودم یکبار تست کردم، راه حل این است که نام جدول را به صورت کاراکتر ارسال کنید و سپس کوئری مورد نظر را به صورت کاراکتری ساخته و از EXEC استفاده کنید و آن را اجرا کنید.
شبیه به این :
نکته : کد بالا و کدهایی شبیه به این شدیدا مستعد حملات sql injection هستند. در این مورد مراقب باشید
declare @sql varchar(max)
select @sql = 'select * from [' + @TableName + ']'
exec (@sql)
-----------------------------------------------
اگر (!! ) میشد کاری شبیه به این کرد بسیار جالب می بود: (این مورد را تست نکرده ام)
declare @tblname varchar(20)
SELECT * FROM
(select TOP(1) * from sysobjects where type = 'U' and name=@tblname )
باز هم عرض میکنم که راه بالا جای تست و بررسی دارد که اگر فرصت شد آن را تصحیح میکنم
سلام به همه دوستان،
استفاده از یک SP عمومی (که قائدتا Dynamic TSQL هم خواهد بود) چندین عیب فنی داره که از نظر عموم برنامه نویسها پوشیده است (از جمله SQL Injection، به هدر دادن حافظه سرور، Recompileهای متعدد و ...).
جز در موارد خاص و قابل توجیه، چنین کاری توصیه نمیشه. در دیتابیسهایی که اصولی طراحی میشن، هر جدول حداقل سه SP برای ویرایش خواهد داشت. از داشتن SPهای زیاد نگران نباشید!