如何在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
答
您的代码似乎工作:
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;
但重新考虑你的方法:
这里的愿望是创建一个表,其名称在运行时确定为 。
如果我们只查看反对在存储的 过程中使用动态SQL的参数,则其中很少适用于此。如果存储的 过程在其中具有静态CREATE TABLE,那么运行 过程的用户必须具有创建表的权限,因此动态SQL将不会更改任何内容。计划缓存显然与它无关。 等等
然而:为什么?你为什么想做这个? 如果您正在应用程序中动态创建 表,那么您已经错过了一些关于数据库设计的基础知识 。在关系数据库中,表和列的集合 应该是不变的。他们可能会在安装新版本时更改 ,但不会在运行期间更改。
有时候当人们这样做时,看起来他们想为 构造临时表的唯一名称。这是完全不需要的,因为这是SQL Server中的一项内置功能。如果你说:
CREATE TABLE #nisse(一INT NOT NULL)
然后在幕后的实际名称将是东西长得多, 并没有其他的连接将能够看到#nisse的这个实例。
那么,什么是错的 –
[不良习惯踢:宣布不VARCHAR(长度)](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick -declaring-varchar-without-length.aspx) - 你应该**总是**为任何'varchar'变量(如'CAST')提供一个长度并使用参数 –