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