2010-03-30 4 views
1

J'ai une table de projet avec les colonnes suivantesonglet croix requête

ProjectID, ProjectDescription 

et une table de données de la liste qui contient les colonnes suivantes

ProjectID ListType Date Memo 

Chaque projet a plusieurs entrées de type liste dans le tableau ListType .

Ce que je veux faire est de lancer une requête qui retournera quelque chose comme ça

ProjectID, ProjectDescription, ListType1, ListType1.date, Listtype1.Memo, ListType2, ListType2.date, ListType.Memo 

againg, chaque projet est coonected à un certain nombre de données de type liste. J'utilise Microsoft SQL 2000. Le mot-clé Pivot ne fonctionne donc pas

Répondre

0

Ce que vous aurez à faire est de créer un SQL dynamique et de générer des instructions CASE supplémentaires pour chaque type de liste. J'ai dû faire quelque chose de similaire pour le travail où ils veulent certaines informations sur les événements. Les événements seraient transmis sous la forme d'une liste séparée par des virgules, puis je construisais les instructions de cas.

J'ai une procédure stockée qui crée une table à partir d'une liste séparée par des virgules

CREATE PROCEDURE [dbo].[ListToTable] 
    @vcList  VARCHAR(8000), 
    @vcDelimiter VARCHAR(8000), 
    @TableName  SYSNAME, 
    @ColumnName SYSNAME 
AS 
    SET NOCOUNT ON 

    DECLARE @iPosStart INT, 
     @iPosEnd INT, 
     @iLenDelim INT, 
     @iExit  INT, 
     @vcStr  varchar(8000), 
     @vcSql  varchar(8000) 

    SET @iPosStart = 1 
    SET @iPosEnd = 1 
    SET @iLenDelim = LEN(@vcDelimiter) 

    SET @vcSql = 'INSERT ' + @TableName + ' (' + @ColumnName + ') VALUES (''' 

    SET @iExit = 0 

    WHILE @iExit = 0 
    BEGIN 
     SET @iPosEnd = CHARINDEX(@vcDelimiter, @vcList, @iPosStart) 

     IF @iPosEnd <= 0 
     BEGIN 
      SET @iPosEnd = LEN(@vcList) + 1 
      SET @iExit = 1 
     END 

     SET @vcStr = SUBSTRING(@vcList, @iPosStart, @iPosEnd - @iPosStart) 

     EXEC(@vcSql + @vcStr + ''')') 

     SET @iPosStart = @iPosEnd + @iLenDelim 
    END 

    RETURN 0 

Ensuite, voici le SQL dynamique

DECLARE @Events VARCHAR(8000) = 'Event1,Event2,... Eventn' 

CREATE TABLE #Events 
    (
    EventName VARCHAR(MAX) 
    ) 

EXEC [ListToTable] 
    @Events 
    ,',' 
    ,'#Events' 
    ,'EventName' 

DECLARE @strCASE VARCHAR(MAX) 
SET @strCase = '' 

DECLARE Events_Cursor CURSOR 
FOR 
SELECT EventName FROM [#Events] 

OPEN Events_Cursor 
DECLARE @EventName VARCHAR(MAX) 

FETCH NEXT FROM Events_Cursor INTO @EventName 
WHILE (@@FETCH_STATUS <> -1) 
    BEGIN 
     IF (@@FETCH_STATUS <> -2) 
      SET @strCase = @strCase + ',CASE WHEN [EventOpportunityProduct].[Name] = ''' + @EventName + ''' THEN EventOppertunityLineItem.[Trial_Status__c] ELSE NULL END [' + @EventName + ']' 
     FETCH NEXT FROM Events_Cursor INTO @EventName 
    END 
CLOSE Events_Cursor 
DEALLOCATE Events_Cursor 

ajouter ensuite @strCASE dans votre instruction SELECT par ex.

DECLARE @strSQL VARCHAR(MAX) 
SET @strSQL = 'SELECT 
    Field1 
    ,Field2 
    ' + @strCASE + ' 
    FROM Table' 

EXEC (@strSQL)