是否有任何方法可以将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 ...
答案 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
在这个例子中:
@DatabaseName是作为参数传递给您的过程。
@FirstID是输出参数 - 此值可能是从您的程序返回的。
在这里您可以找到有关“sp_executesql”的更多信息:
答案 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]'