【问题标题】:passing a TSQL function database name传递 TSQL 函数数据库名称
【发布时间】:2012-09-14 14:56:05
【问题描述】:

有什么方法可以给 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 ...

【问题讨论】:

  • 你能展示你的整个函数而不是...吗?
  • 请问您的最终目标是什么,换句话说,您要解决的业务问题是什么?我不禁想知道是否有更优雅的方法在等待。
  • 对于大约 200 个左右的数据库,我需要检索到非常不同的信息。我们在一个耗时太长的 cusor 中有工作代码。我试图用一个函数替换光标,但再次查看需求并意识到我可以在顶部程序中使用两个 foreachdb 执行我想要的操作,然后将它们连接起来。谢谢。

标签: sql-server tsql function dynamic


【解决方案1】:

为了创建动态 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

在这个例子中:

  1. @DatabaseName 作为参数传递给您的过程。

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

您可以在此处找到有关“sp_executesql”的更多信息:

http://msdn.microsoft.com/en-us/library/ms188001.aspx

【讨论】:

  • 但是你不能在函数中这样做。我会假设 OP 试图将它移动到一个函数中,以便他们可以按查询的每一行调用它......
  • @AaronBertrand 你说得对,“sp_executesql”可以在函数中执行,需要用户存储过程。
【解决方案2】:

更好的解决方案可能是将“@DatabaseName”(一个字符变量)替换为:

“DB_NAME()”。

然后您可以继续传递数据库名称,但首先将它们转换为 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]'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2017-07-21
    • 2012-11-28
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多