sql >> Databáze >  >> RDS >> Sqlserver

SQL Server Dynamic Pivot v UDF, který vrací tabulku

Stejně jako Aaron vysvětlil, že nemůžete použít dynamický sql v UDF, ale dokážu si představit způsob, jak vložit všechny vaše definice funkcí do procedury úložiště a můžete získat výsledky vrácené z uloženého proc do dočasné tabulky, něco takového

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

A pak můžete získat vrácenou sadu výsledků do dočasné tabulky provedením následujícího

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



  1. Jak najdu všechny uložené procedury, které vkládají, aktualizují nebo odstraňují záznamy?

  2. Vytváření dynamické klauzule WHERE v uložené proceduře

  3. Připojení Visual c++ 2008 k MySql

  4. Jak vyřešit ORA-00900