2010-06-09 4 views
0

У меня есть 2 таблицы:Выберите имена столбцов из одной таблицы и соответствующие данные из другой таблицы

  1. ColumnDefinition: имена столбцов будут хранить
  2. ColumnData: соответствующий columniD (имя столбца), мы будем вставлять данные.

мне нужно одно отборное заявление с именами столбцов, а также с данными, как DataSet (из пут может также XML)

ТАБЛИЦЫ.

FormColumDefinition 
------------------------------ 
formColumnID 
formColumnDataType 
formColumnName 
formColumnLabel 
formColumnSeqNumber (just represents how it should appear on the form). 


FormData 
--------------- 
formDataID 
formRowNumber 
formColumnID 
formDataDate (date) - only one of the three date/int/char will have value based on the column data type. 
formDataInt (int) 
formDataChar (varchar)
+0

Что вы пробовали? Некоторые примеры данных и ожидаемый результат помогут нам быть в состоянии помочь вам. –

+0

вам понадобится [Dynamic SQL] (http://www.sommarskog.se/dynamic_sql.html) –

ответ

0

Если я вас правильно понял, учитывая следующее :


SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[FormData](
    [formDataID] [int] IDENTITY(1,1) NOT NULL, 
    [formRowNumber] [int] NOT NULL, 
    [formColumnID] [int] NOT NULL, 
    [formDataDate] [datetime] NULL, 
    [formDataInt] [int] NULL, 
    [formDataChar] [varchar](50) NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
SET IDENTITY_INSERT [dbo].[FormData] ON 
INSERT [dbo].[FormData] ([formDataID], [formRowNumber], [formColumnID], [formDataDate], [formDataInt], [formDataChar]) VALUES (1, 1, 1, NULL, NULL, N'John') 
INSERT [dbo].[FormData] ([formDataID], [formRowNumber], [formColumnID], [formDataDate], [formDataInt], [formDataChar]) VALUES (2, 1, 2, NULL, NULL, N'Private') 
INSERT [dbo].[FormData] ([formDataID], [formRowNumber], [formColumnID], [formDataDate], [formDataInt], [formDataChar]) VALUES (3, 1, 3, NULL, NULL, N'123456') 
INSERT [dbo].[FormData] ([formDataID], [formRowNumber], [formColumnID], [formDataDate], [formDataInt], [formDataChar]) VALUES (4, 2, 1, NULL, NULL, N'Bill') 
INSERT [dbo].[FormData] ([formDataID], [formRowNumber], [formColumnID], [formDataDate], [formDataInt], [formDataChar]) VALUES (5, 2, 2, NULL, NULL, N'Captain') 
INSERT [dbo].[FormData] ([formDataID], [formRowNumber], [formColumnID], [formDataDate], [formDataInt], [formDataChar]) VALUES (6, 2, 3, NULL, NULL, N'789352') 
SET IDENTITY_INSERT [dbo].[FormData] OFF 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[FormColumnDefinition](
    [formColumnID] [int] IDENTITY(1,1) NOT NULL, 
    [formColumnDataType] [varchar](50) NOT NULL, 
    [formColumnName] [varchar](50) NOT NULL, 
    [formColumnLabel] [varchar](50) NOT NULL, 
    [formColumnSeqNumber] [int] NOT NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
SET IDENTITY_INSERT [dbo].[FormColumnDefinition] ON 
INSERT [dbo].[FormColumnDefinition] ([formColumnID], [FormColumnDataType], [formColumnName], [formColumnLabel], [formColumnSeqNumber]) VALUES (1, N'System.String', N'Name', N'Name', 0) 
INSERT [dbo].[FormColumnDefinition] ([formColumnID], [FormColumnDataType], [formColumnName], [formColumnLabel], [formColumnSeqNumber]) VALUES (2, N'String.String', N'Rank', N'Rank', 1) 
INSERT [dbo].[FormColumnDefinition] ([formColumnID], [FormColumnDataType], [formColumnName], [formColumnLabel], [formColumnSeqNumber]) VALUES (3, N'System.Int32', N'SerialNumber', N'Serial Number', 2) 
SET IDENTITY_INSERT [dbo].[FormColumnDefinition] OFF 

Вы можете использовать команду поворота, как:


SELECT formRowNumber, [Name],[Rank],[SerialNumber] 
FROM 
(SELECT fcd.formColumnName, fd.formRowNumber, fd.formDataChar 
FROM FormColumnDefinition fcd INNER JOIN FormData fd 
    ON fcd.formColumnID = fd.formColumnID) AS src 
PIVOT 
(
MAX(formDataChar) 
FOR formColumnName IN ([Name],[Rank],[SerialNumber]) 
) AS pvt 
ORDER BY pvt.formRowNumber 

получить:

 
formRowNumber Name Rank SerialNumber 
1    John Private 123456 
2    Bill Captain 789352 

Проблема с PIVOT является то, что вы должны знать имена столбцов загодя. Если вы не против небольшого динамического SQL, вы можете обойти это тоже. Вот пример того, что я бесстыдно украл у Андраса http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx.

 

DECLARE @cols NVARCHAR(2000); 
SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + formColumnName 
         FROM FormColumnDefinition 
         ORDER BY '],[' + formColumnName 
         FOR XML PATH('') 
        ), 1, 2, '') + ']';     

DECLARE @query NVARCHAR(4000); 
SET @query = N'SELECT formRowNumber, ' + @cols + 
    'FROM (SELECT fcd.formColumnName, fd.formRowNumber, fd.formDataChar ' + 
    'FROM FormColumnDefinition fcd INNER JOIN FormData fd ' + 
    'ON fcd.formColumnID = fd.formColumnID) AS src PIVOT ' + 
    '(MAX(formDataChar) FOR formColumnName IN ('+ @cols + ')) AS pvt ORDER BY pvt.formRowNumber;'; 

EXECUTE(@query); 
 
+0

Спасибо ... Я точно такой же – VInayK

+0

Есть ли способ сделать то же самое с помощью динамического запроса? Потому что, если это возможно, я могу написать одну функцию с табличной оценкой. – VInayK

Смежные вопросы