Sql server DB名称作为用户定义函数中的参数

Sql server DB名称作为用户定义函数中的参数,sql-server,Sql Server,是否可以在用户定义的函数中使用DB name作为参数 例如,我曾尝试使用串联,但这种方式不起作用: create function fn_getEntityOwners (@dbName varchar, @entityId bigint) returns table as return select OWNERS.USER_ID from @dbName + '.dbo.OWNERS' as OWNERS where OWNERS.ENTITY_ID = @en

是否可以在用户定义的函数中使用DB name作为参数

例如,我曾尝试使用串联,但这种方式不起作用:

create function fn_getEntityOwners (@dbName varchar, @entityId bigint)
returns table
as
return 
select
    OWNERS.USER_ID 
from 
    @dbName + '.dbo.OWNERS' as OWNERS
where 
    OWNERS.ENTITY_ID = @entityId

更新:我使用sql server

您需要使用动态sql来完成此操作。这是什么?另一个与之相关的问题是,您需要使用动态SQL来实现这一点。这是什么?另一个与之相关的SO问题是将函数中的代码放入字符串中,并通过动态sql执行

DECLARE @SQL varchar(2000)

SELECT @SQL = 

'select
    OWNERS.USER_ID 
from 
    ' + @dbName + '.dbo.OWNERS as OWNERS
where 
    OWNERS.ENTITY_ID = ' + @entityId


EXEC(@SQL)

将函数中的代码放入字符串中,并通过动态sql执行

DECLARE @SQL varchar(2000)

SELECT @SQL = 

'select
    OWNERS.USER_ID 
from 
    ' + @dbName + '.dbo.OWNERS as OWNERS
where 
    OWNERS.ENTITY_ID = ' + @entityId


EXEC(@SQL)
您还可以在ManagementStudio的“查询”菜单上使用sqlcmd模式来启用此功能

... 这个解决方案是由

whatup@DominionDave-很高兴你能上SO playa:-D

您还可以在ManagementStudio的“查询”菜单上使用sqlcmd模式来启用此功能

... 这个解决方案是由

whatup@DominionDave-很高兴你能上SO playa:-D



很好,SQL Server将支持动态SQL。请参阅我对@DominionDave的评论。很好,SQL Server将支持动态SQL。请参阅我对@DominionDave的评论。我不太喜欢这种方法,因为查询变成字符串,并且未经SQL Server Management Studio验证。但无论如何,谢谢你的解决方案。其他想法?您是否担心数据库不存在并抛出错误?如果是,则可以在查询用户id…if db之前始终添加代码以检查是否存在_id@dbName不是NULL BEGIN…不,我担心在sql查询中出错的情况,但因为它只是一个字符串,所以只有在函数执行后才能知道这一点。我只展示了一个简单的示例,但假设函数中的查询很大且复杂。不可能在函数中使用exec。我不太喜欢这种方法,因为查询变成字符串,并且未经SQL Server Management Studio验证。但无论如何,谢谢你的解决方案。其他想法?您是否担心数据库不存在并抛出错误?如果是,则可以在查询用户id…if db之前始终添加代码以检查是否存在_id@dbName不是NULL BEGIN…不,我担心在sql查询中出错的情况,但因为它只是一个字符串,所以只有在函数执行后才能知道这一点。我只展示了一个简单的示例,但假设函数中的查询很大且复杂。在函数中不可能使用exec@AndriyM的可能副本。我的问题更具体,因为我需要在用户定义函数中使用DB name作为参数,并且函数施加了一些限制。嗯,您只是不能参数化名称DB name、列名、表名。这里和那里几乎所有的答案都建议使用动态SQL。您不能在函数中使用动态SQL,这意味着您在这个特定问题上一无所获。我建议您提出一个新的问题,您可能希望详细说明您正在尝试做什么,以及您将特别询问使用动态SQL的替代方案,或者,可能是使用函数的替代方案。谢谢您的建议,我添加了一个新问题@AndriyM的可能重复项我的问题更具体,因为我需要在用户定义的函数中使用DB name作为参数,并且函数施加了一些限制。好吧,您不能参数化名称DB name、column name、table name。这里和那里几乎所有的答案都建议使用动态SQL。您不能在函数中使用动态SQL,这意味着您在这个特定问题上一无所获。我建议您提出一个新的问题,您可能希望详细说明您正在尝试做什么,以及您将特别询问使用动态SQL的替代方案,或者,可能是使用函数的替代方案。谢谢您的建议,我添加了一个新问题