Sql 如何在Select查询中使用动态模式

Sql 如何在Select查询中使用动态模式,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,我有一个函数dbo.test。请查找以下功能: Alter Function dbo.Test ( ) returns int As Begin Declare @a int Select top 1 @a = Id from CustomFieldMaster return @a End 我正在数据库测试中执行上述功能。有趣的是,这个数据库有schemaTest而不是defaultdbo意味着这些表类似于Test.CustomFieldMaster 当我

我有一个函数dbo.test。请查找以下功能:

Alter Function dbo.Test  
(  

)  
returns int  
As  
Begin  
Declare  @a int  
Select top 1 @a = Id from CustomFieldMaster 
return @a  
End
我正在数据库测试中执行上述功能。有趣的是,这个数据库有schemaTest而不是defaultdbo意味着这些表类似于Test.CustomFieldMaster

当我在Testdb内调用我的上述函数时,它给出以下错误:

无效的对象名称“CustomFieldMaster”

我知道上面的函数给了我这个erorr,因为它试图查找dbo.CustomFieldMaster表,而不是Test.CustomFieldMaster

但是我不能使用测试模式,因为我有许多具有不同模式的数据库,所以将来如果我设计了一个具有许多表的SP,并且希望在每个db中执行该SP,那么在为每个db执行该SP之前,我必须手动更改模式名

我想要一些关键字动态地选择当前登录用户或当前用户的默认模式,因为我的模式名与用户名相同

更新:

Select Current_User
上面会给我用户名,但我不想要动态查询

有什么建议吗


任何快速帮助

由于我们不能在函数中使用动态sql,您也可以创建一个存储过程,如下所示。但这假设整个数据库中只有一个名为CustomFieldMaster的表具有不同的模式名称

create proc dbo.TestProc
@a int  output
As  
Begin  

--
DECLARE @tableName nvarchar(100);
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

--Get full qualified tablename
select @tableName = QUOTENAME(OBJECT_SCHEMA_NAME(object_id('CustomFieldMaster')))
                     + N'.' 
                     + QUOTENAME('CustomFieldMaster')
FROM master.sys.objects;


SET @SQLString =
    N'SELECT top 1 @aOut = Id from '+ @tableName;


SET @ParmDefinition = N'@aOut int OUTPUT';

EXECUTE sp_executesql @SQLString, @ParmDefinition, @aOut = @a OUTPUT;

--Select top 1 @a = Id from @tableName
select @a

End
Go
然后按如下方式执行:

declare @a int 
exec dbo.TestProc @a output
select @a

希望这有帮助

您将需要动态SQL来指定模式name@Szymon:您能简要解释一下您的评论吗?我的回答没有意义,因为我忘了您不能在函数中使用动态SQL。但无论如何,您将无法为查询设置模式,您必须在查询中指定它。是的,没有问题,但这正是我不想要的。正如我在问题中提到的,我有许多数据库具有不同的模式名称,因此在这种情况下,我必须手动更改,这是不可行的。请使用动态SQL创建函数。