天天看点

SQL动态表查询

在程序设计过程中,经常会遇到需要根据用户的选择进行查询的情况,这时,用户不同的选择可能需要查询不同的表名,而且这个表名可能还不宜事先在程序中定死,需要能动态的随机选择。当然还包括表名和用户的某些信息相关,可能不同的用户需要进入不同的表,甚至表名的一部分就是用户名的一部分,等等。对于这些情况,我是使用EXEC语句进行动态甚至动态跨服务器进行查询。我记得刚开始学习SQL语句的时候花了不少时间来找方法,现在将这个方法记下来和有兴趣的人共同分享。

例程如下:

DECLARE @TABLE VARCHAR(50)

SET @TABLE = 'dbo.Mfg_SHOPCAL'

这里主要是使用了EXECUTE(可以简写成EXEC)语句。这个语句功能十分强大,利用它可以在其他程序中随意构建SQL语句,增加了程序的灵活性。

EXEC的主要作用是执行 Transact-SQL 批中的命令字符串、字符串或执行下列模块之一:系统存储过程、用户定义存储过程、标量值用户定义函数或扩展存储过程。

SQL Server 2005 扩展了 EXECUTE 语句,以使其可用于向链接服务器发送传递命令。此外,还可以显式设置执行字符串或命令的上下文。

EXEC的语句规则如下:

指定执行语句的上下文。有关详细信息,请参阅了解执行上下文。

LOGIN 指定要模拟的上下文是登录名。模拟范围为服务器。 USER 指定要模拟的上下文是当前数据库中的用户。模拟范围只限于当前数据库。对数据库用户的上下文切换不会继承该用户的服务器级别权限. 重要事项: 当到数据库用户的上下文切换处于活动状态时,任何对数据库外部资源的访问尝试都会导致语句失败。这包括 USE database 语句、分布式查询和使用三部分或四部分标识符引用其他数据库的查询。若要将上下文切换的范围扩展到当前数据库之外,请参阅使用EXECUTE AS 扩展数据库模拟。 'name' 有效用户或登录名。name 必须是 sysadmin 固定服务器角色成员或分别为sys.database_principals或sys.server_principals的主体。 name 不能为内置帐户,如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或NT AUTHORITY\LocalSystem。 [N] 'command_string' 常量字符串,包含要传递给链接服务器的命令。如果包含N,则字符串将解释为nvarchar 数据类型。 AT linked_server_name 指定对linked_server_name 执行command_string,并将结果(如果有)返回客户端。linked_server_name 必须引用本地服务器中的现有链接服务器定义。链接服务器使用sp_addlinkedserver定义。

     本文转自fengyp 51CTO博客,原文链接:http://blog.51cto.com/fengyp/77220,如需转载请自行联系原作者