여기에는 두 가지 문제가 있습니다. 먼저 동적 SQL을 실행하려면 명령문 변수를 괄호로 묶어야합니다 .
exec @Name
함수 선언에서 에 괄호를 추가해야합니다 . 함수가 작성되지만 실행할 수는 없습니다.exec
그 교체 exec @Name
와 함께exec (@Name)
두 개의 간단한 행을 시도하여이 오류를 쉽게 재현 할 수 있습니다 (ofc는 테이블과 db-name을 가지고있는 것으로 대체하십시오;).
DECLARE @statement VARCHAR(MAX) = 'SELECT * FROM [nana].dbo.Fruits'
exec @statement
이것은 똑같은 오류를 발생시켜야합니다. 그런 다음 ()
주위에 추가 @statement
하면 작동합니다.
두 번째 문제는 결정적이어야하기 때문에 함수에서 동적 SQL을 사용할 수 없다는 것입니다 ( 여기를보십시오 ).
이 문제를 해결하려면 해당 함수 동작을 저장 프로 시저로 다시 작성하고 작동해야합니다.).
함수를 프로 시저로 다시 작성하는 한 가지 방법은 다음과 같습니다 (데이터베이스 구조를 설정하지 않았기 때문에 예상되지 않음).
CREATE PROCEDURE spGetName @OrganisationID INT = NULL, @UserID INT = NULL, @ClientTypeID INT
AS
BEGIN
DECLARE @Name VARCHAR(500)
DECLARE @dbName VARCHAR(500)
SET @dbName = (SELECT ClientDataBase FROM dbo.ClientType WHERE ClientTypeID = @ClientTypeID)
SET @Name = 'select UserName from [' + @dbName + '].dbo.Users where UserID=' + CONVERT(VARCHAR, @UserID)
exec(@Name)
END
GO
-------------------사용해보십시오
exec sp_executesql @statement
출처
https://stackoverflow.com/questions/22008859