sql >> データベース >  >> RDS >> Sqlserver

テーブルを返すUDFのSQLServer動的ピボット

    Aaronが説明したように、UDFで動的SQLを使用することはできませんが、すべての関数定義をストアプロシージャに配置するだけで、ストアドプロシージャから返された結果を次のような一時テーブルに入れる方法を考えることができます

    >
    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
    

    次に、次の手順を実行して、返された結果セットを一時テーブルに取得できます。

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



    1. このSQLはどのように間違っているのでしょうか?私は何を見ていませんか?

    2. mysqlの各人の2番目に高い給与を取得します

    3. カスタムPostgresqlエラーを発生させてEctoで処理する方法

    4. Mysql Connector / JがDATEとTIMEのタイムゾーンを変換しないようにするにはどうすればよいですか?