3

有什么方法可以将数据库名称传递给 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 ...
4

2 回答 2

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

于 2012-09-22T16:48:43.740 回答
0

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

“DB_NAME(<@DBId>)”。

然后,您可以继续传递数据库名称,但首先将它们转换为 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]'
于 2015-03-16T16:50:12.160 回答