Create FUNCTION [dbo].[fngetname]
(
@OrganisationID int=null,
@UserID int=null,
@ClientTypeID int
)
RETURNS varchar(500)
BEGIN
DECLARE @Name VARCHAR(500)
DECLARE @dbName VARCHAR(500)
set @dbName=(select ClientDataBase from dbo.ClientType where ClientTypeID=@ClientTypeID)
begin
set @Name='select UserName from ['+ @dbName+'].dbo.Users where UserID='+convert(varchar,@UserID)
exec @Name
end
return @Name
end
Run Code Online (Sandbox Code Playgroud)
这里有两个问题,首先如果你想执行动态sql,你需要将你的语句变量封装在括号中:
您需要exec @Name在函数声明中添加括号。该函数已写入但无法执行它停止在exec
将其替换exec @Name为exec (@Name)
您只需尝试两行简单的代码即可轻松重现此错误(ofc 将表和数据库名称替换为您拥有的内容;)):
DECLARE @statement VARCHAR(MAX) = 'SELECT * FROM [nana].dbo.Fruits'
exec @statement
Run Code Online (Sandbox Code Playgroud)
这应该会引发完全相同的错误。然后添加()周围@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11703 次 |
| 最近记录: |