PDA

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



hamed-p
دوشنبه 19 اسفند 1387, 06:46 صبح
http://parsi-l.persiangig.com/image/03.gifبا درود
من يك جدول به نام ReportsFileds دارم و يك جدول به نام HYD_FM_01 كه توي جدول ReportsFileds فيلدي به نام TagNo وجود دارد كه مقدار آن در واقع نام فيلدي است كه بايد از جدول HYD_FM_01 انتخاب (Select) شود.

من اين دستور را به شكل زير نوشته ام:


SELECT distinct FormName, Description, RangeLow, RangeHigh, Unit, TagNo,
(SELECT TF1.TagNo FROM HYD_FM_01) AS Val FROM ReportsFileds as TF1


ولي به جاي اين‌كه TF1.TagNo به عنوان نام فيلد در نظر گرفته شود؛ همان مقدار در فيلد مجازي Val جاي مي‌گيرد.

http://parsi-l.persiangig.com/image/01.gif

http://parsi-l.persiangig.com/image/02.gif

EffatBandehlou
دوشنبه 19 اسفند 1387, 08:18 صبح
دوست عزيز select شما اشتباهه . يعني به خواستتون نمي رسيد.
در select دوم شما در واقع محتويات tag از جدول اول رو خواستيد كه اونو در فيلد قبلي هم آورديد.
لطفاً منظورتون رو واضحتر بگين تا اگه تونستم كمكتون كنم.

hamed-p
دوشنبه 19 اسفند 1387, 08:44 صبح
دوست عزيز select شما اشتباهه . يعني به خواستتون نمي رسيد.
در select دوم شما در واقع محتويات tag از جدول اول رو خواستيد كه اونو در فيلد قبلي هم آورديد.
لطفاً منظورتون رو واضحتر بگين تا اگه تونستم كمكتون كنم.

با سپاس
http://parsi-l.persiangig.com/image/04.gif
http://parsi-l.persiangig.com/image/05.gif

در همين مثال،
مي‌خوام در فيلد مجازي val به جاي PR_730 مقدار 10.00 و به جاي TI_494 مقدار 20.00 قرار بگيرد.
ولي اكنون خود نام فيلد را به جاي آن مي‌نشاند.
http://parsi-l.persiangig.com/image/01.gif

EffatBandehlou
دوشنبه 19 اسفند 1387, 08:57 صبح
دستور زير رو امتحان كن.

(Select TagNo From HYD_FM_01) as Val

hamed-p
دوشنبه 19 اسفند 1387, 10:13 صبح
دستور زير رو امتحان كن.


(Select TagNo From HYD_FM_01) as Val

خروجي همونه ...

EffatBandehlou
دوشنبه 19 اسفند 1387, 10:27 صبح
دوست عزيز Select دوم كه از جدول HYD هست به لحاظ منطقي اشتباه است.
زيرا ممكن است در اين جدول بيش از يك ركورد وجود داشته باشد.پس شما بايد براي آن حتماً يك شرط تعريف كنيد.
لطف كنيد و اطلاعات موجود در هر دو جدول را براي من بزاريد تا Select درست رو براتون بنويسم

hamed-p
دوشنبه 19 اسفند 1387, 12:25 عصر
دوست عزيز Select دوم كه از جدول HYD هست به لحاظ منطقي اشتباه است.
زيرا ممكن است در اين جدول بيش از يك ركورد وجود داشته باشد.پس شما بايد براي آن حتماً يك شرط تعريف كنيد.
لطف كنيد و اطلاعات موجود در هر دو جدول را براي من بزاريد تا Select درست رو براتون بنويسم
درسته، اين دستور ساده‌ي اون بود و where را بعداً اضافه مي‌كردم.
به‌هرحال اينم اطلاعات جدول‌ها



GO
CREATE TABLE [dbo].[HYD_FM_01](
[HYD_FM_01_Id] [int] IDENTITY(1,1) NOT NULL,
[CreateDate] [char](10) COLLATE Arabic_CI_AS NULL,
[ShiftTime] [char](2) COLLATE Arabic_CI_AS NULL,
[PR_730] [decimal](7, 2) NULL,
[TI_494] [decimal](7, 2) NULL,
[TI_502] [decimal](7, 2) NULL,
[FR_743] [decimal](7, 2) NULL,
CONSTRAINT [PK_HYD_FM_01] PRIMARY KEY CLUSTERED
(
[HYD_FM_01_Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF




GO
CREATE TABLE [dbo].[ReportsFileds](
[tblReportsFileds_Id] [int] IDENTITY(1,1) NOT NULL,
[FormName] [varchar](30) COLLATE Arabic_CI_AS NULL CONSTRAINT [DF_ReportsFileds_FormName] DEFAULT (''),
[Description] [varchar](100) COLLATE Arabic_CI_AS NULL CONSTRAINT [DF_ReportsFileds_Description] DEFAULT (''),
[RangeLow] [varchar](10) COLLATE Arabic_CI_AS NULL CONSTRAINT [DF_ReportsFileds_RangeLow] DEFAULT (''),
[RangeHigh] [varchar](10) COLLATE Arabic_CI_AS NULL CONSTRAINT [DF_ReportsFileds_RangeHigh] DEFAULT (''),
[RangLowMin] [varchar](10) COLLATE Arabic_CI_AS NULL CONSTRAINT [DF_ReportsFileds_RangLowMin] DEFAULT (''),
[RangHighMax] [varchar](10) COLLATE Arabic_CI_AS NULL CONSTRAINT [DF_ReportsFileds_RangHighMax] DEFAULT (''),
[Unit] [varchar](30) COLLATE Arabic_CI_AS NULL CONSTRAINT [DF_ReportsFileds_Unit] DEFAULT (''),
[TagNo] [varchar](50) COLLATE Arabic_CI_AS NULL CONSTRAINT [DF_ReportsFileds_TagNo] DEFAULT ('')
CONSTRAINT [PK_ReportsFileds] PRIMARY KEY CLUSTERED
(
[tblReportsFileds_Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF

hamed-p
دوشنبه 19 اسفند 1387, 12:43 عصر
GO
/****** Object: Table [dbo].[ReportsFileds] Script Date: 03/09/2009 13:10:47 ******/
SET IDENTITY_INSERT [dbo].[ReportsFileds] ON
INSERT [dbo].[ReportsFileds] ([tblReportsFileds_Id], [FormName], [Description], [RangeLow], [RangeHigh], [RangLowMin], [RangHighMax], [Unit], [TagNo]) VALUES (1, N'HYD_FM_01', N'Feed flow : total (meter reading)', N'', N'', N'', N'', N'', N'')
INSERT [dbo].[ReportsFileds] ([tblReportsFileds_Id], [FormName], [Description], [RangeLow], [RangeHigh], [RangLowMin], [RangHighMax], [Unit], [TagNo]) VALUES (2, N'HYD_FM_01', N'Feed k.o. drum press.', N'20', N'23', N'', N'', N'barg', N'PR_730')
INSERT [dbo].[ReportsFileds] ([tblReportsFileds_Id], [FormName], [Description], [RangeLow], [RangeHigh], [RangLowMin], [RangHighMax], [Unit], [TagNo]) VALUES (3, N'HYD_FM_01', N'Feed temp', N'0', N'70', N'', N'', N'°C', N'TI_494')
SET IDENTITY_INSERT [dbo].[ReportsFileds] OFF
/****** Object: Table [dbo].[HYD_FM_01] Script Date: 03/09/2009 13:10:47 ******/
SET IDENTITY_INSERT [dbo].[HYD_FM_01] ON
INSERT [dbo].[HYD_FM_01] ([HYD_FM_01_Id], [CreateDate], [ShiftTime], [PR_730], [TI_494], [TI_502]) VALUES (1, '1387/12/18', '09', CAST(12.00 AS Decimal(7, 2)), CAST(15.00 AS Decimal(7, 2)), NULL)
SET IDENTITY_INSERT [dbo].[HYD_FM_01] OFF

EffatBandehlou
دوشنبه 19 اسفند 1387, 13:10 عصر
دوست عزيز اگه عجله نداري تا فردا برات درست مي كنم.

EffatBandehlou
سه شنبه 20 اسفند 1387, 09:05 صبح
CREATE FUNCTION dbo.test (@t as varchar(50))
RETURNS Decimal AS
BEGIN
Declare @R as Decimal
----------------------------------------
IF @t='PR_730'
Begin
Select @R=PR_730 From HYD_FM_01
End
-----------------------------------------
IF @t='TI_494'
Begin
Select @R=TI_494 From HYD_FM_01
End
-----------------------------------------
IF @t='TI_502'
Begin
Select @R=TI_502 From HYD_FM_01
End
-----------------------------------------
IF @t='FR_743'
Begin
Select @R=FR_743 From HYD_FM_01
End
-----------------------------------------
Return (@R)
END
------------------------------------
SELECT FormName, Description, RangeLow, RangeHigh, Unit, TagNo,dbo.test(TagNo) as val
FROM ReportsFileds
دوست عزيز فايل ضميمه پاسخ سوال شماست

hamed-p
سه شنبه 20 اسفند 1387, 10:40 صبح
CREATE FUNCTION dbo.test (@t as varchar(50))
RETURNS Decimal AS
BEGIN
Declare @R as Decimal
----------------------------------------
IF @t='PR_730'
Begin
Select @R=PR_730 From HYD_FM_01
End

دوست عزيز فايل ضميمه پاسخ سوال شماست

با سپاس
مي‌شه اين از چنين دستوري استفاده كرد؟
البته شكل استفاده از دستور را درست نمي‌دانم و پرسش‌م شكل درست استفاده از دستور است.



Execute ('Select ' + @t + ' From HYD_FM_01',@R Output)

EffatBandehlou
سه شنبه 20 اسفند 1387, 10:53 صبح
دوست عزيز دستور Exec براي اجراي storedprocdure است.و شما در يه select معمولي نمي تونيد اونو به كار ببريد.

hamed-p
سه شنبه 20 اسفند 1387, 12:29 عصر
دوست عزيز دستور Exec براي اجراي storedprocdure است.و شما در يه select معمولي نمي تونيد اونو به كار ببريد.
به هر روی، سپاس‌گزارم.