如果列不存在,我尝试使用SqlCommandProvider (FSharp.Data.SqlClient的一部分)创建列,然后设置约束(自引用)。问题是它不会编译,因为它检测到作为约束的一部分的列还不存在。我试着把它包在另一块里,但没有用。
[<Literal>]
let CreateParentColumn = "
IF COL_LENGTH('Company', 'ParentId') IS NULL
BEGIN
ALTER TABLE Company
ADD ParentId INT
ALTER TABLE Company
ADD CONSTRAINT FK_ParentIdCompanyId FOREIGN KEY (ParentId)
REFERENCES Company(CompanyId);
END
"
type CreateParentIdColumn = SqlCommandProvider<CreateParentColumn, connectionString>我非常希望不使用动态sql。我想知道是否有一种方法可以推迟计算,以便它能够正常运行(注意,查询本身在中运行良好)
错误1类型提供程序'FSharp.Data.SqlCommandProvider‘报告了一个错误:引用表'FK_ParentIdCustomerId’中的外键‘FK_ParentIdCustomerId’引用无效列'ParentId‘。无法创建约束。请参阅先前的错误。
发布于 2015-09-10 15:45:07
简单的回答是“不,这是不可能的”。
更详细的答案是“由于根本原因不能这样做:运行时数据库模式特性应该已经在编译时出现,以便被FSharp.Data.SqlClient类型提供程序使用”。
从学术兴趣的角度来看,在运行时在数据库中创建额外的列和约束并不是一个问题(尽管这是一个非常不寻常的实践),并且没有必要为此目的涉及动态SQL。通过与类型提供程序并排使用普通ADO可以很容易地实现:
use cmd = new System.Data.SqlClient.SqlCommand(CreateParentColumn, connectionString)
cmd.ExecuteNonQuery() |> ignore但是,实际的问题是,这个新创建的列在FSharp.Data.SqlClient类型提供程序上下文中没有任何用处,因为它在编译时还不存在于数据库模式中,类型提供程序可以任意使用它。
重新措辞时,FSharp.Data.SqlClient类型提供程序不会在运行时执行任何操作,它的作业已在编译时完成。
https://stackoverflow.com/questions/32486345
复制相似问题