我们认为我们最近遇到了竞争问题,其中一些t-sql从我们的应用程序中执行,并且相信我们找到了导致此问题的原因。
我们在不同时间调用t-sql来保留应用程序中需要的临时数据。其中的一部分还包括在某些情况下删除表,然后再次创建它。我们最近发现查询表时遇到异常,例如:
Exception: System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'PK_ConsoleData' in the database.
Could not create constraint or index. See previous errors.
和
Exception: RowDataGateway.ExecuteSQLStatementFailedException: SQL Statement Failed ---> System.Data.SqlClient.SqlException: Invalid column name 'OriginationSourceHasSubJobLevelErrors'.
Invalid column name 'OriginationSourceHasJobLevelErrors'.
Invalid column name 'OriginationSourceHasSubJobLevelErrors'.
Invalid column name 'DataSourceHasJobLevelErrors'.
我在查看microsoft文档时发现,我们的很多t-sql都执行了一些操作,例如删除表并在同一批中创建它。.每个microsoft:
DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch. Otherwise an unexpected error may occur.
示例代码:
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'ConsoleData' AND TABLE_SCHEMA = N'DBO')
BEGIN
DROP TABLE DBO.[ConsoleData]
END
BEGIN
CREATE TABLE DBO.[ConsoleData]
(
Column names..
CONSTRAINT [PK_ConsoleData] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)
)
END
当前,我刚刚决定将查询拆分为单独的方法,并分别调用每个方法。我试图读取批处理分隔符,但我们不能使用GO命令(它会导致语法错误,并且每个microsoft都会使用):
Applications based on the ODBC or OLE DB APIs receive a syntax error if they try to execute a GO command. The SQL Server utilities never send a GO command to the server.
是否有另一种方法可以一次从应用程序中调用某些SQL,但是特定部分是作为单独的批处理执行的,还是将调用分为不同的方法更好的做法?