我想使用变量中的值创建数据库。在这里我的脚本,但它不起作用。有任何想法吗?使用变量的名称创建数据库
-- Set Data Base name
DECLARE @DataBaseName char(64);
SET @DataBaseName = 'DbCmsWebsiteTest';
-- Create Data Base
CREATE DATABASE @DataBaseName;
GO
我想使用变量中的值创建数据库。在这里我的脚本,但它不起作用。有任何想法吗?使用变量的名称创建数据库
-- Set Data Base name
DECLARE @DataBaseName char(64);
SET @DataBaseName = 'DbCmsWebsiteTest';
-- Create Data Base
CREATE DATABASE @DataBaseName;
GO
您将需要为了这个,我觉得动态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
但我不会自己检查有效的名称规则,而是让CREATE引发。例如,您的支票排除了许多有效的字符,如空格,'_','-'等。 – 2010-08-03 19:17:30
@Remus - 同意 - 我对SQL注入的可能性有点矛盾,但我猜QUOTENAME会处理这个问题。 – 2010-08-03 19:24:50
事实上,推荐的方法是sp_executesql功能。
下面是使用它的一个例子:
DECLARE @SqlCommand NVARCHAR(255), @DatabaseName NVARCHAR(63)
SET @DatabaseName = 'DbName'
SET @SqlCommand = N'CREATE DATABASE ' + @DatabaseName
EXECUTE sp_executesql @SqlCommand
在'@ DatabaseName'附近给出错误的语法。'您需要找到一些接受数据库名称参数的语法(在这种情况下,您不需要动态SQL,您可以直接调用它) – 2010-08-03 15:41:10
此外对Martin的评论,'sp_executesql'是SQL Server 2005+的语法,而ATM我们不知道这是什么版本的SQL Server ... – 2010-08-03 15:48:04
明白了!我确实有点匆忙:)我对sp_executesql的想法是基于msdn建议尽可能使用它的事实。但是,由于它的主要优势在于执行计划,所以我认为在这种情况下使用哪种选项并不重要。 – Corina 2010-08-03 18:03:41
当然需要动态地创建一个数据库通常是数据库设计缺陷的迹象。 – HLGEM 2010-08-03 18:58:27
为什么数据库设计存在缺陷? – GibboK 2010-08-03 19:59:27