免责声明:正如我在评论中指出的那样,让一群用户直接访问 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;