LINQ-to-SQL .ExecuteCommand()不适用于参数化对象名称

Jak*_*ter 4 .net c# t-sql sql-server-2008 linq-to-sql

我对此感到有点沮丧,并希望有人能澄清发生了什么.

我想使用我的LINQ-to-SQL数据上下文以编程方式禁用外键约束.看起来这应该像以下一样简单:

context.ExecuteCommand( "ALTER TABLE {0} NOCHECK CONSTRAINT {1}", "MyTable", "FK_MyTable_MyOtherTable" );

不幸的是,这段代码因SQL错误"@ p0'附近的语法不正确"而遭到轰炸.

当我启动分析器时,我发现生成的SQL是:

exec sp_executesql 
N'ALTER TABLE @p0 NOCHECK CONSTRAINT @p1',
N'@p0 varchar(4000),@p1 varchar(4000)',
@p0=N'MyTable',
@p1=N'FK_MyTable_MyOtherTable'
Run Code Online (Sandbox Code Playgroud)

从我在SQL Books Online和LINQ-to-SQL文档中可以找到的所有内容中,这应该可行.

我改用了这个:

context.ExecuteCommand( String.Format( "ALTER TABLE {0} NOCHECK CONSTRAINT {1}", "MyTable", "FK_MyTable_MyOtherTable" ) );

它有效,但它有点失败了能够将参数传递给.ExecuteCommand()的目的.

那么这在LINQ-to-SQL,SQL Server中是一种什么样的怪癖,还是我真的很困惑?

任何见解将不胜感激!

mar*_*c_s 7

正如您所知 - Linq-to-SQL将非常积极地尝试参数化您的查询.在大多数情况下,这是一件好事.

但是在ALTER TABLE...语句的情况下,诸如表名等之类的东西不能被参数化 - 因此,它失败了.

我不知道是否有任何办法让Linq-to-SQL 参数化要执行的某些查询ExecuteCommand- 同时,我认为,这些语句不涉及操纵数据(插入,更新等)而是操纵数据库的结构,最好的String.Format(...)办法是在调用之前使用该方法将实际的SQL查询作为字符串.ExecuteCommand().