传递SQL函数数据库名称

时间:2012-09-22 11:01:25

标签: sql-server tsql function dynamic

是否有任何方法可以将sql函数传递给数据库名称,以便它可以对该数据库执行选择

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 ...

2 个答案:

答案 0 :(得分: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是输出参数 - 此值可能是从您的程序返回的。

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

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

答案 1 :(得分:0)

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

“DB_NAME(小于@ DBID&GT)”。

然后,您可以继续传入数据库名称,但首先将它们转换为fcn中的ID。如果使用“sp_executesql”来帮助防止SQL注入(“DB_NAME()”不是变量/无法替换),还有点解决了在其中构建SQL stmt w / char变量的矛盾。

所以你有这个:

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]'