Выберите на столе 2 возможных структуры - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь написать запрос, который выберет данные из таблицы.из-за разных версий базы данных, есть две возможные структуры исходной таблицы, где более новая версия имеет на 2 поля больше, чем старая.

Я попытался определить более старую структуру и заменить столбцы наNULL, а также попытался написать 2 отдельных запроса с оператором IF и указанием на правильный.Ни одно из этих решений не работает, и в обоих случаях кажется, что движку SQL не удается проверить эти 2 столбца.

Примеры моих попыток решения:

IF NOT EXISTS (SELECT * 
               FROM   sys.objects 
               WHERE  object_id = Object_id(N'[dbo].[Test2]') 
                      AND type IN ( N'U' )) 
  BEGIN 
      CREATE TABLE [dbo].[test2] 
        ( 
           [id]       [INT] IDENTITY(1, 1) NOT NULL, 
           [statusid] [INT] NULL 
        ) 
  END 

go 

DECLARE @Flag INT = 0 

IF EXISTS(SELECT 1 
          FROM   sys.columns 
          WHERE  NAME = N'TestId' 
                 AND object_id = Object_id(N'dbo.Test2')) 
  SET @Flag = 1 

--Solution #1
IF @Flag = 1 
  SELECT id, 
         statusid, 
         testid 
  FROM   dbo.test2 
ELSE 
  SELECT id, 
         statusid 
  FROM   dbo.test2 

--Solution #2
    SELECT id, 
           statusid, 
           CASE 
             WHEN @Flag = 1 THEN testid 
             ELSE NULL 
           END AS TestId 
    FROM   dbo.test2 

1 Ответ

0 голосов
/ 24 июня 2018

вы можете использовать Dynamic SQL и сгенерировать запрос, соответственно, зависит от значения @flag

declare @sql    nvarchar(max)

select  @sql    = N'select id, statusid, '
                + case when @flag = 1 then 'testid' else 'NULL' end + ' as testid'
                + ' from dbo.test2'

print   @sql
exec    sp_executesql @sql

Но будет не так просто кодировать и поддерживать динамический запрос, если у вас сложный запрос.

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