SMO 无法执行具有用户定义表类型的脚本

本文关键字:定义 类型 脚本 用户 执行 SMO | 更新日期: 2023-09-27 18:36:52

我正在尝试执行从文件中读取的sql脚本;但是,当我去执行脚本时,我遇到了异常:

Column, parameter, or variable #1: Cannot find data type dbo.ExistingTableType.
Must declare the table variable "@existingTableType".
Parameter or variable '@existingTableType' has an invalid data type.

我尝试通过复制文本并在 SQL Server 管理工作室中运行它来测试脚本,它确实成功运行。此外,其他脚本可以运行,但由于某种原因,那些将用户定义的表类型作为参数的脚本不能运行。下面是一个简单的例子:

C#

string script = scriptFile.OpenText().ReadToEnd();
SqlConnection connection = new SqlConnection(connectionString);
Server server = new Server(new ServerConnection(connection));
server.ConnectionContext.StatementTimeout = 100;
server.ConnectionContext.ExecuteNonQuery(script);

.SQL

CREATE PROCEDURE [dbo].[failedStoredProcedure]
(
    @existingTableType dbo.ExistingTableType READONLY
)
AS
-- Do something here
GO

完成的其他测试:

  • 已尝试连接字符串中的其他用户。

编辑:此外,当脚本运行时,当对象确实存在时,它会返回"无效的对象名称{x}"。

SMO 无法执行具有用户定义表类型的脚本

我尝试了你的代码(SQL 2012 Express),它工作得很好。 sql 帐户是否具有对该类型的授权?

似乎在某些时候,SMO 对象发生了一些事情,它不再适用于指定的数据库,尽管数据库名称是预期的对象。

为了纠正此问题,我创建了一个新的数据库对象并从那里应用脚本:

Server server = new Server();
server.ConnectionContext.ConnectionString = connectionString;
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
Database db = server.Databases[builder.InitialCatalog];

然后稍后改为运行

db.ExecuteNonQuery(script);