如何在SQL Server中创建变量名表?

问题描述:

WHILE @i < @deptcount + 1 
    BEGIN 
     --creating dynamic tables 
     DECLARE @tablenames NVARCHAR(50) 

     SET @tablenames = 'dept' + Cast(@i AS NVARCHAR) 

     EXECUTE ('create table '[email protected]+ 
     ' (deptno int, formno int, stdpr int, agg int)') 

     SET @i = @i + 1 
    END 
+3

那么,什么是错的 –

+0

[不良习惯踢:宣布不VARCHAR(长度)](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick -declaring-varchar-without-length.aspx) - 你应该**总是**为任何'varchar'变量(如'CAST')提供一个长度并使用参数 –

您的代码似乎工作:

DECLARE @i INT = 0, @deptcount INT = 4; 

while @i < @deptcount+1 
Begin 
    --creating dynamic tables 
    declare @tablenames nvarchar(50) 
    set @tablenames = '##dept'+CAST(@i as nvarchar) 
    execute('create table '[email protected]+' (deptno int, formno int, stdpr int, agg int)') 
    set @i = @i +1 
End 

SELECT * 
FROM ##dept1 
UNION ALL 
SELECT * 
FROM ##dept2 
UNION ALL 
SELECT * 
FROM ##dept3; 

LiveDemo

但重新考虑你的方法:

CREATE TABLE @tbl

这里的愿望是创建一个表,其名称在运行时确定为 。

如果我们只查看反对在存储的 过程中使用动态SQL的参数,则其中很少适用于此。如果存储的 过程在其中具有静态CREATE TABLE,那么运行 过程的用户必须具有创建表的权限,因此动态SQL将不会更改任何内容。计划缓存显然与它无关。 等等

然而:为什么?你为什么想做这个? 如果您正在应用程序中动态创建 表,那么您已经错过了一些关于数据库设计的基础知识 。在关系数据库中,表和列的集合 应该是不变的。他们可能会在安装新版本时更改 ,但不会在运行期间更改。

有时候当人们这样做时,看起来他们想为 构造临时表的唯一名称。这是完全不需要的,因为这是SQL Server中的一项内置功能。如果你说:

CREATE TABLE #nisse(一INT NOT NULL)

然后在幕后的实际名称将是东西长得多, 并没有其他的连接将能够看到#nisse的这个实例。

+0

**非常感谢你** – Khalid

+1

@Khalid,如果这个或任何答案已经解决了您的问题,请点击复选标记考虑[接受它](http://meta.stackexchange.com/q/5234/179419)。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。 – AHiggins