首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多用户查询-最佳实践

多用户查询-最佳实践
EN

Stack Overflow用户
提问于 2013-02-28 06:40:12
回答 1查看 2.2K关注 0票数 1

我目前有大约10个用户在我的工作场所使用他们自己的个性化查询进行内部流程。用户在查询的顶部输入几个值,点击execute,然后,他们的报告就会显示在网格中。它们访问的源数据表是相同的,但其中创建的表用后缀_User1,_User2...User10进行了个性化。每次运行查询时,都会删除先前创建的表,然后重新创建。整个查询大约需要1秒才能运行。

结构的大部分看起来像这样重复5次,5个步骤得到他们想要的输出:

代码语言:javascript
复制
DROP TABLE z
SELECT *
INTO z
FROM y

现在,用户数量成倍增加到50,这意味着主查询代码中的每一次调整都将导致我更改50个特定于用户的查询,并将它们发送回来。10个用户可管理且令人讨厌,50个用户则完全不可管理。

我的问题是,构建数据库/查询的最佳方法是什么?理想情况下,我希望只有一个查询,一组已创建的表(而不是50个)。由于它只需要1秒就可以运行,我们是否会冒着两个或更多用户(具有不同输入)同时运行查询、访问相同的表并以某种方式获得错误数据的风险,因为他们在完全相同的时间运行它?

有没有一种特殊的方式来做这件事?希望有人能提供一些线索。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-28 06:53:27

免责声明:正如我在我的评论中指出的那样,让一群用户直接访问SSMS来运行报告是一个非常糟糕的想法。获得某种形式的前端,甚至一个简单的MS Access数据库-例如,您只需要一个许可证就可以开发数据库,您可以让其他用户访问Runtime。如果用户不知道自己在做什么,那么有很多方法会让你一团糟。我将在下面提供一些想法,但我不建议这样做

一种解决方案是:使用临时表,这样就不必担心每个用户的表重叠:

代码语言:javascript
复制
-- drop the table if it already exists
if object_id('tempdb..#z') is not null
    DROP TABLE #z

SELECT *
INTO #z
FROM y

当您为表名加上#前缀时,它将成为连接范围内的临时表,这意味着单独的会话将看不到其他会话中的临时表,即使它们具有相同的名称。

通常没有必要创建临时表,除非您有一些非常复杂的场景。您应该能够使用子查询、视图、CTE和存储过程来实时生成输出,而不涉及任何新表。您甚至可以构建引用其他视图的视图和过程,以便组织复杂的逻辑。例如,您可以将逻辑封装到存储过程中,如下所示:

代码语言:javascript
复制
CREATE PROCEDURE TheReport
(
    @ReportID int,
    @Name varchar(50),
    @SomeField varchar(10)
)
AS
BEGIN
    -- do some complicated query here
    SELECT field1, field2 FROM Result Q
END

然后,您甚至不必向用户发送更新(除非字段发生更改)。只需让他们的查询调用存储过程,您就可以在方便的时候直接更新该过程:

代码语言:javascript
复制
DECLARE @ReportID int
DECLARE @Name varchar(50)
DECLARE @SomeField varchar(10)

-- YOU CAN MODIFY THIS --
SET @ReportID = 5
SET @Name = 'MyName'
SET @SomeField = 'abc'
-- DON'T MODIFY BELOW THIS LINE --

EXEC [TheReport] @ReportID, @Name, @SomeField;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15123931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档