如何使用实体框架核心传递不带单个撇号的 SQL 查询参数



>我正在尝试使用 SQL Server 2012。我有一个数据库,我需要通过代码创建一个数据库的新用户。但我不用它来管理。

首先,这是我的SQL查询

CREATE USER TestUser FOR LOGIN TestUser

在SQL Server中,它运行良好。

我有这个代码:

internal class ServerContext : DbContext
{
    public ServerContext(DbContextOptions<ServerContext> options) : base(options) { }
}

<'''>

DbContextOptions<ServerContext> _options;
var optionsBuilder = new DbContextOptionsBuilder<ServerContext>();
var connectionString = string.Format(ConnectionString.ConnectString, url, dbName, login, password);
_options = optionsBuilder.UseSqlServer(connectionString).Options;
using (var context = new ServerContext(_options))
{
    if (data.Count() == 0)
    {
       context.Database.ExecuteSqlCommand(Query.CreateDbUser, new SqlParameter("@Login", "user"));
    }
}

<'''>

public static class Query
{    
     public static string CreateDbUser = "CREATE USER @Login FOR LOGIN @Login";
}

此查询转换为:

 exec sp_executesql N'CREATE USER @Login FOR LOGIN @Login',N'@Login nvarchar(4)',@Login=N'User' 

我收到此错误:

"@Login"周围的语法无效。

我认为这是因为参数"user"作为字符串传递并在执行查询时用引号指定。

不能使用以下语句,因为变量不能替换对象的名称:

exec sp_executesql N'CREATE USER @Login FOR LOGIN @Login',N'@Login nvarchar(4)',@Login=N'User'

这将尝试创建一个名为 @Login 的用户,这是无效的。您需要使用动态 SQL:

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'CREATE USER ' + QUOTENAME(@Login) + N' FOR LOGIN '+ QUOTENAME(@Login) + N';';
EXEC sp_executesql @SQL;

最新更新