Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server Dynamic Pivot in UDF, das eine Tabelle zurückgibt

Wie Aaron erklärt hat, können Sie in UDF kein dynamisches SQL verwenden, aber ich kann mir einen Weg vorstellen, einfach alle Ihre Funktionsdefinitionen in eine Speicherprozedur zu stecken, und Sie können die Ergebnisse, die von der gespeicherten Prozedur zurückgegeben werden, in eine temporäre Tabelle wie diese

CREATE PROC usp_GetProviderIds 
@DoctorId INT
AS
BEGIN
    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX),
        @id as int = 1;

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(QUALIFIER) 
            FROM PROVIDERIDS
            LEFT OUTER JOIN TEMPDOCS on TEMPDOCS.DOCID = PROVIDERIDS.PARENTID
            WHERE DOCID = @id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT DOCID, NAME, ' + @cols + ' from 
            (
                select TEMPDOCS.DOCID, TEMPDOCS.NAME, PROVIDERIDS.QUALIFIER, PROVIDERIDS.IDENTIFIER FROM TEMPDOCS
                LEFT OUTER JOIN PROVIDERIDS ON PROVIDERIDS.PARENTID=TEMPDOCS.DOCID
                WHERE TEMPDOCS.DOCID = ' + CAST(@ID AS VARCHAR(30)) + '
           ) x
            pivot 
            (
                MAX(IDENTIFIER)
                FOR QUALIFIER IN (' + @cols + ')
            ) p '


    EXECUTE sp_Executesql @query  
END

Und dann können Sie die zurückgegebene Ergebnismenge in eine temporäre Tabelle bringen, indem Sie Folgendes tun

CREATE TABLE #TempTable (Col1, Col2.....)
INSERT INTO #TempTable
EXEC usp_GetProviderIds @DoctorId