Sql 创建一个数据库,使用作为变量的名称

Sql 创建一个数据库,使用作为变量的名称,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想使用变量中的值创建一个数据库。这里是我的脚本,但它不工作。有什么想法吗 -- 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 char(64);
SET @DataBaseName = 'DbCmsWebsiteTest';

-- Create Data Base
CREATE DATABASE @DataBaseName;
GO

我认为这需要动态SQL(如果名称是用户提供的,则需要采取适当的预防措施)


实际上,推荐的方法是函数

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

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

在“@DatabaseName”附近给出了不正确的语法。除了Martin的评论之外,您还需要找到一些接受数据库名称参数的语法(在这种情况下,您不需要动态SQL,您可以直接调用它)。sp_executesql是SQL Server 2005+语法,我们不知道这是什么版本的SQL Server…明白了!我确实有点匆忙:)我对sp_executesql的想法是基于msdn建议尽可能使用它的事实。但是,由于它的主要优点是在执行计划方面,我想在这种情况下使用哪个选项并不重要。当然,动态创建数据库的需要通常是数据库设计缺陷的标志。但是我自己不会检查有效的名称规则,而是让创建规则提高。例如,您的检查排除了许多有效字符,如空格、
-
等。@Remus-同意-我对SQL注入的可能性有点矛盾,但我想QUOTENAME无论如何都会处理这个问题。
DECLARE @SqlCommand NVARCHAR(255), @DatabaseName NVARCHAR(63)
SET @DatabaseName = 'DbName'
SET @SqlCommand = N'CREATE DATABASE ' + @DatabaseName
EXECUTE sp_executesql @SqlCommand