Sql server 传递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

是否有任何方法向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 
(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是作为参数传递给过程的

  • @FirstID是输出参数-此值可能是从您的过程返回的

  • 在这里,您可以找到有关“sp_executesql”的更多信息:


    更好的解决方案可能是将“@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”,需要用户存储过程。