Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server Dynamic Pivot trong UDF trả về bảng

Giống như Aaron đã giải thích, bạn không thể sử dụng dynamic sql trong UDF nhưng tôi có thể nghĩ ra một cách là chỉ cần đặt tất cả định nghĩa hàm của bạn trong một thủ tục lưu trữ và bạn có thể lấy kết quả trả về từ proc được lưu trữ vào một bảng tạm như thế này

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

Và sau đó, bạn có thể lấy kết quả trả về được đặt thành một bảng tạm thời bằng cách thực hiện như sau

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để CHÈN SỐ LƯỢNG LỚN với cột bổ sung hiển thị tên tệp?

  2. Làm cách nào để lấy danh sách tất cả các bảng trong cơ sở dữ liệu bằng TSQL?

  3. Cập nhật T-SQL với SUM và Group BY

  4. Cách giải quyết Câu lệnh không trả về lỗi tập hợp kết quả?

  5. Tìm tên bảng trong tất cả các đối tượng của tất cả cơ sở dữ liệu