2010-08-03 62 views
2

我想使用变量中的值创建数据库。在这里我的脚本,但它不起作用。有任何想法吗?使用变量的名称创建数据库

-- Set Data Base name 
DECLARE @DataBaseName char(64); 
SET @DataBaseName = 'DbCmsWebsiteTest'; 

-- Create Data Base 
CREATE DATABASE @DataBaseName; 
GO 
+0

当然需要动态地创建一个数据库通常是数据库设计缺陷的迹象。 – HLGEM 2010-08-03 18:58:27

+1

为什么数据库设计存在缺陷? – GibboK 2010-08-03 19:59:27

回答

10

您将需要为了这个,我觉得动态SQL(用适当的预防措施,如果用户提供的名称)

-- Set Data Base name 
DECLARE @DataBaseName sysname; 
SET @DataBaseName = 'DbCmsWebsiteTest'; 

IF (@DataBaseName LIKE '%[^0-9A-Z]%') 
    RAISERROR('Invalid Characters in Name, %s',16,1,@DataBaseName) 
ELSE 
    BEGIN 
    SET @DataBaseName = QUOTENAME(@DataBaseName) 
    EXEC('CREATE DATABASE '+ @DataBaseName) 
    END 
+0

但我不会自己检查有效的名称规则,而是让CREATE引发。例如,您的支票排除了许多有效的字符,如空格,'_','-'等。 – 2010-08-03 19:17:30

+1

@Remus - 同意 - 我对SQL注入的可能性有点矛盾,但我猜QUOTENAME会处理这个问题。 – 2010-08-03 19:24:50

3

事实上,推荐的方法是sp_executesql功能。

下面是使用它的一个例子:

DECLARE @SqlCommand NVARCHAR(255), @DatabaseName NVARCHAR(63) 
SET @DatabaseName = 'DbName' 
SET @SqlCommand = N'CREATE DATABASE ' + @DatabaseName 
EXECUTE sp_executesql @SqlCommand 
+1

在'@ DatabaseName'附近给出错误的语法。'您需要找到一些接受数据库名称参数的语法(在这种情况下,您不需要动态SQL,您可以直接调用它) – 2010-08-03 15:41:10

+0

此外对Martin的评论,'sp_executesql'是SQL Server 2005+的语法,而ATM我们不知道这是什么版本的SQL Server ... – 2010-08-03 15:48:04

+0

明白了!我确实有点匆忙:)我对sp_executesql的想法是基于msdn建议尽可能使用它的事实。但是,由于它的主要优势在于执行计划,所以我认为在这种情况下使用哪种选项并不重要。 – Corina 2010-08-03 18:03:41

相关问题