Исправить устаревший SQL-запрос, прежде чем SQL Server его выполнит? - PullRequest
3 голосов
/ 27 декабря 2011

Запуск SQL Server 2005. Часть программного обеспечения интегрируется с нашей базой данных. К сожалению, они решили делать прямые запросы SQL вместо использования хранимых процедур. Теперь мы изменили схему нашей базы данных, и рассматриваемый запрос больше не действителен.

Можно ли исправлять T-SQL во время выполнения на SQL Server?

например. Когда SQL Server получает SELECT A FROM InvalidTable для конкретной базы данных, запрос будет преобразован в SELECT A FROM ValidTable непосредственно перед его выполнением.

Edit: Это вопрос в вопросе:

SELECT * FROM DataTable c JOIN Users u ON u.UserName = @P0 AND c.DepartmentID = b2.DepartmentID WHERE c.Status = 0, где DepartmentID переместился на другой стол!

Ответы [ 2 ]

8 голосов
/ 27 декабря 2011

Вы можете использовать Представления и Синонимы, чтобы скрыть изменения схемы.

Таким образом, для простых вещей (например, InvalidTable теперь ValidTable), вы можете определить синоним

CREATE SYNONYM InvalidTable FOR CorrectSchema.ValidTable;

Для более сложных вещей (столбцы, 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

Редактировать, после того, как ОП поймет, что они обманули себя

Вы не можете иметь представление или синоним, если в одной базе данных существует таблица с таким же именем.

Итак, используйте другую БД и используйте вместо этого устаревшее приложение. В этих примерах вы бы имели DataTable в другой БД, предполагая, что вы можете использовать другую БД без изменения кода

USE legacyDB
GO
CREATE VIEW DataTable
AS
SELECT
   *
FROM
   CorrectDB.CorrectSchema.ValidTable V
   JOIN
   CorrectDB.CorrectSchema.OtherTable O ON ...
GO

В противном случае переименуйте правильную БД и укажите весь не унаследованный код в переименованной БД.

4 голосов
/ 27 декабря 2011

Я могу думать только о том, чтобы использовать представления для абстрагирования имен ValidTable. Что-то вроде:

create view InvalidTable
as

    select Col1, Col2, Col3, ColN
    from ValidTable

go

В зависимости от того, сколько объектов базы данных содержится и знания о том, являются ли они действительными / недействительными, это будет огромной головной болью.

Вы находитесь в плохой ситуации, и первый вопрос, который я хотел бы задать, - это почему вы меняете схему базы данных стороннего приложения?

...