2010-06-09 9 views
0

J'ai 2 tables:Sélectionnez les noms de colonnes d'une table et les données correspondantes d'une autre table

  1. ColumnDefinition: les noms de colonnes stocker
  2. ColumnData: correspondant ColumnID (nom de colonne) nous insérer les données.

J'ai besoin d'une instruction select avec les noms de colonnes et avec des données comme un DataSet (eteint peut aussi XML)

TABLES:.

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

Qu'avez-vous essayé? Quelques exemples de données et de résultats attendus nous aideraient à vous aider. –

+0

vous aurez besoin de [Dynamic SQL] (http://www.sommarskog.se/dynamic_sql.html) –

Répondre

0

Si je vous comprends bien, compte tenu de ce qui suit :


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 

Vous pouvez utiliser une commande de pivot comme:


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 

pour obtenir:

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

Le problème avec PIVOT est que vous devez connaître les noms de colonnes à l'avance. Si cela ne vous dérange pas un peu SQL dynamique, vous pouvez contourner cela aussi. Voici un exemple que j'ai volé sans vergogne à Andras au 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

Merci ... Je regarde exactement la même chose – VInayK

+0

Y at-il un moyen de faire la même chose sans out en utilisant la requête dynamique? Parce que si c'est possible, je peux écrire une fonction de valeur table. – VInayK

Questions connexes