select
union all
동적 쿼리를 반환해야 하는 사용자 정의 테이블 반환 함수 만들기 .
나는 테이블이 tbl_tablesinfo
테이블 이름을 포함 tbl1
, tbl2
, tbl3
모든 약 3000 테이블 이름에서 등.
뷰를 만들고 싶지 않지만 수행하여 select * from
모든 테이블을 반환해야 하는 함수입니다 union all
.
내 시도:
CREATE FUNCTION udf_alldata()
RETURNS TABLE
AS
BEGIN
DECLARE @Var VARCHAR(MAX) = ''
SELECT
@Var = STUFF((SELECT ' SELECT * FROM [' + tbl.TableNames + '] UNION ALL'
FROM [TestDB].SYS.TABLES tb
INNER JOIN [TestDB].dbo.[tbl_tablesinfo] tbl ON tb.name = tbl.TableNames
FOR XML PATH('')), 1, 1, '');
SET @var = LEFT(@var, LEN(@var) - 10);
EXEC @var
RETURN
END
오류가 발생합니다.
'BEGIN' 근처에 잘못된 구문이 있습니다.
이렇게 하는 이유는 3k 테이블로 뷰를 생성하는 것이 느려지고 30분 정도의 시간이 걸리기 때문에 함수를 생성하여 대안을 찾고 있습니다.
에서 문서 말했다 분명하다 :
사용자 정의 함수는 동적 SQL 또는 임시 테이블을 사용할 수 없습니다. 테이블 변수가 허용됩니다.
즉, 저장 프로시저를 사용해야 하며 원하는 경우 테이블에 데이터를 삽입할 수 있으므로 나쁘지 않습니다.
INSERT INTO @Table
EXEC [dbo].[stored_procedured_name]
INSERT INTO #Table
EXEC [dbo].[stored_procedured_name]
따라서 귀하의 경우 다음을 갖게 됩니다.
CREATE PROCEDURE udf_alldata
AS
BEGIN
DECLARE @Var VARCHAR(MAX) = ''
SELECT
@Var = STUFF((SELECT ' SELECT * FROM [' + tbl.TableNames + '] UNION ALL'
FROM [TestDB].SYS.TABLES tb
INNER JOIN [TestDB].dbo.[tbl_tablesinfo] tbl ON tb.name = tbl.TableNames
FOR XML PATH('')), 1, 1, '');
SET @var = LEFT(@var, LEN(@var) - 10);
EXEC sp_executesql @var
RETURN
END
실제로 실행할 수 dynamic T-SQL in function
있지만 이것은 SQL CLR을 사용하는 특별한 경우입니다. 이 작업을 수행하는 방법을 보여드릴 수 있지만 저장 프로시저를 고수하는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다