TSQL Force Приведение всех столбцов в определении представления - PullRequest
0 голосов
/ 28 августа 2018

У меня есть около 500 простых Sql-представлений, каждая из которых ссылается на 1 или 2 базовых таблицы. Представления используются для взаимодействия с другой системой.

Как принудительно привести все столбцы к отражению текущих типов данных

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

SELECT  
    CAST (T1.ColumnA AS NUMERIC(38, 0)),
    CAST (T1.ColumnB AS DATE),
    CAST (T1.ColumnC AS VARCHAR(900)),
    CAST (T2.ColumnA AS TIME(7)),
    CAST (T2.ColumnB AS VARCHAR(4))
FROM 
    Table1 T1   
LEFT JOIN 
    Table2 T2 ON T1.ID = T2.ID

Все предложения приветствуются.

1 Ответ

0 голосов
/ 28 августа 2018

Вам не нужно ничего делать. Даже если типы столбцов таблицы изменены, они в представлениях не изменяются. Если вы хотите изменить типы столбцов в представлении, вы должны явно сделать это, удалив / воссоздав представление или используя sp_refreshview . Так что беспокоиться не о чем.

Вот код, демонстрирующий это:

DROP TABLE IF EXISTS [dbo].[StackOverflow];

CREATE TABLE [dbo].[StackOverflow]
(
    [ColumnA] INT
   ,[ColumnB] NVARCHAR(25)
   ,[ColumnC] DATETIME2(0)
);

GO

DROP VIEW IF EXISTS [dbo].[vw_StackOverflow];
GO

CREATE VIEW [dbo].[vw_StackOverflow]
AS
SELECT [ColumnA]
      ,[ColumnB]
      ,[ColumnC] 
FROM [dbo].[StackOverflow];

GO

SELECT C.[name]
      ,T.[name]
      ,C.[max_length]
      ,c.[precision]
      ,c.[scale]
FROM [sys].[columns] C
INNER JOIN [sys].[types] T
    ON C.[system_type_id] = T.[system_type_id]
WHERE [object_id] = OBJECT_ID('[dbo].[vw_StackOverflow]');

GO

ALTER TABLE [dbo].[StackOverflow]
ALTER COLUMN [ColumnA] BIGINT;

ALTER TABLE [dbo].[StackOverflow]
ALTER COLUMN [ColumnB] NVARCHAR(12);

ALTER TABLE [dbo].[StackOverflow]
ALTER COLUMN [ColumnC] DATETIME2(7);

GO


SELECT C.[name]
      ,T.[name]
      ,C.[max_length]
      ,c.[precision]
      ,c.[scale]
FROM [sys].[columns] C
INNER JOIN [sys].[types] T
    ON C.[system_type_id] = T.[system_type_id]
WHERE [object_id] = OBJECT_ID('[dbo].[vw_StackOverflow]');


GO

EXEC sp_refreshview N'[dbo].[vw_StackOverflow]';

GO


SELECT C.[name]
      ,T.[name]
      ,C.[max_length]
      ,c.[precision]
      ,c.[scale]
FROM [sys].[columns] C
INNER JOIN [sys].[types] T
    ON C.[system_type_id] = T.[system_type_id]
WHERE [object_id] = OBJECT_ID('[dbo].[vw_StackOverflow]');


GO

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...