我目前有大约10个用户在我的工作场所使用他们自己的个性化查询进行内部流程。用户在查询的顶部输入几个值,点击execute,然后,他们的报告就会显示在网格中。它们访问的源数据表是相同的,但其中创建的表用后缀_User1,_User2...User10进行了个性化。每次运行查询时,都会删除先前创建的表,然后重新创建。整个查询大约需要1秒才能运行。
结构的大部分看起来像这样重复5次,5个步骤得到他们想要的输出:
DROP TABLE z
SELECT *
INTO z
FROM y现在,用户数量成倍增加到50,这意味着主查询代码中的每一次调整都将导致我更改50个特定于用户的查询,并将它们发送回来。10个用户可管理且令人讨厌,50个用户则完全不可管理。
我的问题是,构建数据库/查询的最佳方法是什么?理想情况下,我希望只有一个查询,一组已创建的表(而不是50个)。由于它只需要1秒就可以运行,我们是否会冒着两个或更多用户(具有不同输入)同时运行查询、访问相同的表并以某种方式获得错误数据的风险,因为他们在完全相同的时间运行它?
有没有一种特殊的方式来做这件事?希望有人能提供一些线索。
谢谢
发布于 2013-02-28 06:53:27
免责声明:正如我在我的评论中指出的那样,让一群用户直接访问SSMS来运行报告是一个非常糟糕的想法。获得某种形式的前端,甚至一个简单的MS Access数据库-例如,您只需要一个许可证就可以开发数据库,您可以让其他用户访问Runtime。如果用户不知道自己在做什么,那么有很多方法会让你一团糟。我将在下面提供一些想法,但我不建议这样做。
一种解决方案是:使用临时表,这样就不必担心每个用户的表重叠:
-- drop the table if it already exists
if object_id('tempdb..#z') is not null
DROP TABLE #z
SELECT *
INTO #z
FROM y当您为表名加上#前缀时,它将成为连接范围内的临时表,这意味着单独的会话将看不到其他会话中的临时表,即使它们具有相同的名称。
通常没有必要创建临时表,除非您有一些非常复杂的场景。您应该能够使用子查询、视图、CTE和存储过程来实时生成输出,而不涉及任何新表。您甚至可以构建引用其他视图的视图和过程,以便组织复杂的逻辑。例如,您可以将逻辑封装到存储过程中,如下所示:
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然后,您甚至不必向用户发送更新(除非字段发生更改)。只需让他们的查询调用存储过程,您就可以在方便的时候直接更新该过程:
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;https://stackoverflow.com/questions/15123931
复制相似问题