在SQL Server执行之前修补过时的SQL查询?

l33*_*33t 3 sql sql-server patch runtime

运行SQL Server 2005.一个软件与我们的数据库集成.不幸的是,他们选择直接进行SQL查询而不是使用存储过程.现在我们已经更改了我们的数据库方案,并且有问题的查询不再有效.

是否可以在SQL Server上运行时修补T-SQL?

例如,当SQL Server获取SELECT A FROM InvalidTable特定数据库时,查询将SELECT A FROM ValidTable在执行之前转换为.

编辑: 这是有问题的查询:

SELECT * FROM DataTable c JOIN Users u ON u.UserName = @P0 AND c.DepartmentID = b2.DepartmentID WHERE c.Status = 0哪里DepartmentID搬到了另一张桌子!

gbn*_*gbn 8

您可以使用视图和同义词来隐藏架构更改.

因此,对于简单的事情(如InvalidTable现在ValidTable),您可以定义同义词

CREATE SYNONYM InvalidTable FOR CorrectSchema.ValidTable;
Run Code Online (Sandbox Code Playgroud)

对于更复杂的事物(列,JOIN,表拆分,数据类型等),您需要一个视图

CREATE VIEW InvalidTable 
AS
SELECT 
   col1, col2, 
   CAST(col3 AS varchar(1000)) AS col3, -- fix data type
   1 AS col4  -- not used now, but expected in legacy calls
FROM
   CorrectSchema.ValidTable
WHERE
   col5 = 'Something'
GO
Run Code Online (Sandbox Code Playgroud)

编辑,在OP意识到他们自己搞砸了之后

如果在同一数据库中存在具有相同名称的表,则不能拥有视图或同义词.

因此,使用另一个数据库并使遗留应用程序使用它.在这些示例中,您可以在另一个数据库中使用DataTable,并假设您可以使用另一个不使用更改代码的数据库

USE legacyDB
GO
CREATE VIEW DataTable
AS
SELECT
   *
FROM
   CorrectDB.CorrectSchema.ValidTable V
   JOIN
   CorrectDB.CorrectSchema.OtherTable O ON ...
GO
Run Code Online (Sandbox Code Playgroud)

否则,重命名正确的数据库并将所有非遗留代码指向重命名的数据库.