我对此感到有点沮丧,并希望有人能澄清发生了什么。
我想使用我的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'
我可以在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中的某种怪癖,还是我真的很困惑?
非常感谢任何见解!
答案 0 :(得分:7)
正如您所知 - Linq-to-SQL将非常积极地尝试参数化您的查询。在大多数情况下,这是好事。
但是在ALTER TABLE...
语句的情况下,诸如表名等之类的东西不能被参数化 - 因此,它失败了。
我不知道是否有任何办法让Linq-to-SQL 不参数化某些查询由ExecuteCommand
执行 - 与此同时,我认为,不要涉及操纵数据(插入,更新等),而是操纵数据库的结构,最好的办法是在调用{{1}之前使用String.Format(...)
方法将实际的SQL查询作为字符串。 }}
答案 1 :(得分:1)
您不能将SQL对象用作参数。因此第二个版本是唯一的选择。
答案 2 :(得分:1)
Linq to SQL基本上只是翻译您提供的内容。问题是您不能将表名作为参数,因此以下操作无效。
DECLARE @TableName varchar
SET @Tablename='MyTable'
SELECT * FROM @TableName
看起来你已经有了一个解决方案,我认为这是一个很好的解决方案。