ورود

View Full Version : مشکل در ساختن رشته حاوی نام جدول، برای خواندن از جدول مربوطه



emad4000
دوشنبه 04 دی 1391, 14:47 عصر
سلام دوستان
من یه سری جدول دارم که محتوی یکسان دارن، ولی براساس سال از هم جدا شدن
یعنی اسم همشون یک پیشوند و پسوند یکسان داره، فقط عدد مربوط به سال وسط این رشته اومده
مثلاً
Table1380Kerman
Table1381Kerman
Table1390Kerman


حالا می خوام یک کوئری بنویسم که پارامتر سال رو بگیره و بره از تو جدول مربوط به اون سال چندتا ستون خاص رو برگردونه
من این تابع (Multi State Function) رو توی SQL Server 2008 براش نوشتم



ALTER FUNCTION [dbo].[TF_GetSalary] ( @year nvarchar(4) )
RETURNS @T_ReturnTable TABLE ( F_Column1 int, F_Column2 int )
AS
BEGIN
INSERT @T_ReturnTable
SELECT Column1, Column2
FROM [MyDB].[dbo].['Table' +@year + 'Kerman']
RETURN
END


این تابع ساخته میشه، ولی وقتی می خوام ازش داده بخونم خطا میده
دستور خواندن داده :



SELECT * FROM [MyDB].[dbo].[TF_GetSalary] ('1390')
GO


خطای ظاهر شده:



Msg 208, Level 16, State 1, Line 1
Invalid object name 'MyDB.dbo.'Table' + @year + 'Kerman''.



لطفا اگه کسی میدونه مشکل از کجاست راهنمایی کنه، ممنون میشم

ferdin
دوشنبه 04 دی 1391, 21:43 عصر
سلام
دوست عزیز ، پیشنهاد می کنم که از sp استفاده کنی ، اما اگه می خوای از function استفاده کنی یک متغیری از نوع table با همون استراکچری که تو function تعریف کردی ، تعریف کن ، بعد به صورت کد زیر استفاده کن :


select @TbResult = dbo.tf_getSalary
select * from @TbResult

emad4000
شنبه 09 دی 1391, 08:52 صبح
سلام
دوست عزیز ، پیشنهاد می کنم که از sp استفاده کنی ، اما اگه می خوای از function استفاده کنی یک متغیری از نوع table با همون استراکچری که تو function تعریف کردی ، تعریف کن ، بعد به صورت کد زیر استفاده کن :


select @TbResult = dbo.tf_getSalary
select * from @TbResult


سلام
ممنون دوست عزیز، ولی توضیحاتتون خیلی واضح نیست، احساس می کنم منظور من رو درست متوجه نشدین
SQLServer اصلاً نمیگذاره من جلوی FROM اسم جدولم رو به این شکل بسازم، یعنی این تابع TF_GetSalary اصلاً ساخته نمیشه که بعدا بتونم فراخوانیش کنم

البته من در نهایت با StoredProcedure مشکلم رو حل کردم، ولی نفهمیدم چطوری می تونم همینو تو Function بنویسم؟

محمد سلیم آبادی
شنبه 09 دی 1391, 19:22 عصر
ولی نفهمیدم چطوری می تونم همینو تو Function بنویسم؟
همون بهتره که کوئریتون رو به رشته تبدیل کنید سپس با execute اجراش کنید.
ولی اگه اصرار دارین که از همون تکنیک تابع کارتون رو انجام بدین(که منم توصیه نمیکنم) میتونید داخل تابع هر سه جدول رو با هم اجتماع کنید به این شکل:
CREATE FUNCTION [dbo].[TF_GetSalary] ( @year nvarchar(4) )
RETURNS TABLE
AS RETURN
(
WITH CTE AS
(SELECT Column1, Column2, K =1380
FROM [MyDB].[dbo].Table1380Kerman
UNION ALL
SELECT Column1, Column2, K =1381
FROM [MyDB].[dbo].Table1381Kerman
UNION ALL
SELECT Column1, Column2, K =1390
FROM [MyDB].[dbo].Table1390Kerman)

SELECT Column1, Column2
FROM CTE
WHERE K = @year
);

حالا کوئری زیر به درستی عمل میکنه:

SELECT * FROM [MyDB].[dbo].[TF_GetSalary] ('1390')
GO
در این مثال لزومی نداره پارامتر ورودی از نوع رشته ای باشه.

emad4000
یک شنبه 10 دی 1391, 09:51 صبح
همون بهتره که کوئریتون رو به رشته تبدیل کنید سپس با execute اجراش کنید.


ممنون از راهنماییتون
روش جالبیه
ولی در نهایت مجبور شدم توی یک SP ، رشته حاوی دستور رو Execute کنم، چون بعدا یه پارامتر ورودی دیگه اضافه شده به اسم toYear@
که می بایست مجموع اون ستون رو توی این رِنج سال ها حساب کنم