1

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

大多数结构看起来像这样重复 5 次,这 5 个步骤得到所需的输出:

DROP TABLE z
SELECT *
INTO z
FROM y

现在,用户数量增加到 50 个,这意味着主查询代码中的每次调整都会导致我更改 50 个特定于用户的查询并将它们发送回去。10 个用户可以管理和烦人,50 个用户完全无法管理。

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

通常有没有特定的方法?希望有人可以提供一些启示。

谢谢

4

1 回答 1

2

免责声明:正如我在评论中指出的那样,让一群用户直接访问 SSMS 以运行报告是一个非常糟糕的主意。获得某种前端,甚至是一个简单的 MS Access 数据库 - 例如,您只需要一个许可证即可开发数据库,​​并且您可以为其余用户提供 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;
于 2013-02-27T22:53:26.960 回答