Sql server 传递TSQL函数数据库名称
是否有任何方法向tsql函数传递数据库名称,以便它可以在该数据库上执行选择Sql server 传递TSQL函数数据库名称,sql-server,tsql,function,dynamic,Sql Server,Tsql,Function,Dynamic,是否有任何方法向tsql函数传递数据库名称,以便它可以在该数据库上执行选择 ALTER function [dbo].[getemailjcp] ( @DB_Name varchar(100) ) Returns varchar(4000) AS BEGIN DECLARE @out varchar (4000); DECLARE @in varchar (1000); Set @out = (select substring ((select ';' + e.email from (SEL
ALTER function [dbo].[getemailjcp]
(
@DB_Name varchar(100)
)
Returns varchar(4000)
AS
BEGIN
DECLARE @out varchar (4000);
DECLARE @in varchar (1000);
Set @out =
(select substring
((select ';' + e.email from
(SELECT DISTINCT ISNULL(U.nvarchar4, 'NA') as email
FROM [@DB_Name].dbo.Lists ...
为了创建动态SQL语句,您应该存储过程。例如:
DECLARE @DynamicSQLStatement NVARCHAR(MAX)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @FirstID BIGINT
SET @ParmDefinition = N'@FirstID BIGINT OUTPUT'
SET @DynamicSQLStatement=N' SELECT @FirstID=MAX(ID) FROM ['+@DatabaseName+'].[dbo].[SourceTable]'
EXECUTE sp_executesql @DynamicSQLStatement,@ParmDefinition,@FirstID=@FirstID OUTPUT
SELECT @FirstID
在本例中:
更好的解决方案可能是将“@DatabaseName”(一个char变量)替换为: “DB_NAME()” 然后,您可以继续传入db名称,但首先要将它们转换为fcn中的ID。如果使用“sp_executesql”来帮助防止SQL注入(“DB_NAME()”不是变量/不能替换),那么还可以解决在其中构建带有char变量的SQL stmt的矛盾 所以你会有这个:
DECLARE @DynamicSQLStatement NVARCHAR(MAX)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @FirstID BIGINT
DECLARE @DBId INT
SET @DBId = DB_ID(@Db_Name) --raise the proper security/robustness** concern if this doesn't resolve.
SET @ParmDefinition = N'@FirstID BIGINT OUTPUT'
SET @DynamicSQLStatement=N' SELECT @FirstID=MAX(ID) FROM ['+DB_NAME(@DBId)+'].[dbo].[SourceTable]'
你能展示你的全部功能而不是
…
?我可以问一下你的最终目标是什么,换句话说,你试图解决的业务问题是什么?我忍不住想知道是否还有更优雅的方法在等待着我。对于大约200个数据库,我需要检索到非常不同的信息片段。我们在cusor中使用的代码太长了。我试图用一个函数替换游标,但再次查看了需求,意识到我可以用两个foreachdb在顶层过程中做我想做的事情,然后连接起来。谢谢你,但你不能在函数中这样做。我假设OP试图将其移动到一个函数,这样他们就可以在查询的每一行调用它。也许…@AaronBertrand您是对的,可以在函数中执行“sp_executesql”,需要用户存储过程。