Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 insert into select при разных таблицах  [new]
xopc
Member

Откуда:
Сообщений: 14
Доброе время.
Подскажите, конструкция insert into table1 select * from table2, где таблицы 1 и 2 идентичные, кроме одного дополнительного столбца в таблице 1. Как-то красиво можно реализовать такой инсерт, без перечисления всех столбцов и значений?
21 июн 17, 09:02    [20579363]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
xopc,

абсолютно порочная практика писать *, тут нет других комментариев
21 июн 17, 09:04    [20579371]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5623
Если настолько лень выписывать все поля руками - сохранить где-нибудь у себя запрос
select stuff(v.x.value('.', 'nvarchar(max)'), 1, 2, '')
from (
  select ', '+quotename(name)
  from sys.columns
  where object_id=object_id(N'dbo.MyTable')
  order by column_id
  for xml path(''), type
) v(x)

запускать его, копировать результат, удалять/добавлять нужное, вставлять в нужный запрос.
21 июн 17, 09:15    [20579408]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20189
xopc, надо думать не о красоте, а о корректности. Вот через пару лет изменится структура, какое-нибудь поле переименуется или переместится в структуре, или добавится во вторую таблицу, и будешь ты, как лох педальный, все свои звёздочки искать и править - оно тебе надо? Звёзды вообще где-либо, кроме COUNT(*), лучше не ставить...
А на эффективность это никак не влияет.
21 июн 17, 09:16    [20579412]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Сон Веры Павловны,

alt+f1 -> жмакнуть Column_name -> ctrl+c -> ctrl+ v-> alt+shift + down -> , -> profit :)
21 июн 17, 09:18    [20579425]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
Сон Веры Павловны,

alt+f1 -> жмакнуть Column_name -> ctrl+c -> ctrl+ v-> alt+shift + down -> , -> profit :)

А я просто в SSMS "Столбцы" из обозревателя объектов в окно редактирования перетаскиваю... А если хочется сразу с форматированием и скобками, то ПКМ -> Script Object -> ... SELECT ... -> ...
21 июн 17, 09:39    [20579490]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Руслан Дамирович
TaPaK
Сон Веры Павловны,

alt+f1 -> жмакнуть Column_name -> ctrl+c -> ctrl+ v-> alt+shift + down -> , -> profit :)

А я просто в SSMS "Столбцы" из обозревателя объектов в окно редактирования перетаскиваю... А если хочется сразу с форматированием и скобками, то ПКМ -> Script Object -> ... SELECT ... -> ...

меня тошнит когда я дерево объектов открываю, и пока до нужного дойду... :)
21 июн 17, 09:42    [20579502]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
TaPaK
Руслан Дамирович
пропущено...

А я просто в SSMS "Столбцы" из обозревателя объектов в окно редактирования перетаскиваю... А если хочется сразу с форматированием и скобками, то ПКМ -> Script Object -> ... SELECT ... -> ...

меня тошнит когда я дерево объектов открываю, и пока до нужного дойду... :)

Поставьте себе SSMSBoost и доходите до нужного по Ctrl+F2 - тошнить перестанет.
Но если именно про копирование колонок говорить - то через Alt+F1 быстрее, согласен.
21 июн 17, 09:51    [20579547]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Minamoto,

автор
Поставьте себе SSMSBoost и доходите до нужного по Ctrl+F2 - тошнить перестанет.

тогда меня будет тошнить от SSMSBoost :)
21 июн 17, 09:52    [20579557]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Minamoto
TaPaK
пропущено...

меня тошнит когда я дерево объектов открываю, и пока до нужного дойду... :)

Поставьте себе SSMSBoost и доходите до нужного по Ctrl+F2 - тошнить перестанет.
Но если именно про копирование колонок говорить - то через Alt+F1 быстрее, согласен.

Я привык к чистому SSMS, я даже JS/XSLT/XML/PHP до сих пор в notepad++ правлю, никаких IDE.
Да и domain policy - без админов ничего не поставишь.
Заморачиваться мотивации нет. Жили же как-то раньше без всех этих плюшек, интернет при свечах сёрфили.
21 июн 17, 09:57    [20579573]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3457
Сон Веры Павловны
Если настолько лень выписывать все поля руками - сохранить где-нибудь у себя запрос
select stuff(v.x.value('.', 'nvarchar(max)'), 1, 2, '')
from (
  select ', '+quotename(name)
  from sys.columns
  where object_id=object_id(N'dbo.MyTable')
  order by column_id
  for xml path(''), type
) v(x)

запускать его, копировать результат, удалять/добавлять нужное, вставлять в нужный запрос.


Можно и не сохранять, а каждый раз формировать строку и выполнять динамический запрос
21 июн 17, 11:38    [20579953]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
Руслан Дамирович,

автор
Я привык к чистому SSMS, я даже JS/XSLT/XML/PHP до сих пор в notepad++ правлю, никаких IDE.
Да и domain policy - без админов ничего не поставишь.
Заморачиваться мотивации нет. Жили же как-то раньше без всех этих плюшек, интернет при свечах сёрфили.


     
  ALTER  PROCEDURE  dbo.TableFields     
    @Name      Varchar(600)    
   ,@Prefix    Varchar(200) = ''    
   ,@Postfix   Varchar(200) = ''    
   ,@ShowTypes Bit = 0     
   ,@Quotate   Bit = 0    
    
  AS    
  BEGIN     
         
    DECLARE     
      @IsTemp bit = 0     
    IF LEFT(@Name, 1) = '#' BEGIN  SET @IsTemp = 1  END    
        
    DECLARE @ObjectId Int      
         
    
    IF @IsTemp = 0     
    BEGIN     
      IF OBJECT_ID(@Name) IS NULL BEGIN     
        RAISERROR ('Не найден объект: %s', 1, 1, @Name)    
        RETURN 0     
      END    
          
      SET @ObjectId = OBJECT_ID(@Name)        
    END    
    ELSE     
    BEGIN     
      IF OBJECT_ID('tempdb..' + @Name) IS NULL BEGIN     
        RAISERROR ('Не найден объект: %s', 1, 1, @Name)    
        RETURN 0     
      END    
          
      SET @ObjectId = OBJECT_ID('tempdb..' + @Name)       
    
    END     
    DECLARE     
      @Query NVarchar(MAX)     
    SET @Query = ''     
     
    SET @Query = 'SELECT '      
      + '''' + @Prefix + ''' + '       
      + CASE     
          WHEN @Quotate = 1 THEN ' QUOTENAME(C.Name) '     
          WHEN @Quotate = 0 THEN ' C.Name '    
          ELSE ''     
        END     
      + CASE      
          WHEN @ShowTypes = 1 THEN     
          '+ '' '' + T.Name +  CASE WHEN T.Name LIKE ''%char%'' THEN '' ('' + CAST(C.max_length AS Varchar(10)) + '')''  ELSE '''' END '    
          ELSE ''    
        END    
      + '+''' + @Postfix + ''''    
      + ' FROM ' + CASE WHEN @IsTemp = 1 THEN 'tempdb.' ELSE '' END + 'sys.columns C'     
      + CASE      
          WHEN @ShowTypes = 1 THEN     
         ' INNER JOIN ' + CASE WHEN @IsTemp = 1 THEN 'tempdb.' ELSE '' END + 'sys.types T ON T.system_type_id = C.system_type_id AND T.name <> ''sysname'' AND T.Name <> ''bident'' AND T.Name <> ''string'''    
          ELSE ''     
        END    
      + ' WHERE [object_id] = ' + CAST(@ObjectId AS Varchar (30))     
      + ' ORDER BY column_id'     
        
 
    PRINT @Query      
    IF LEN(@Query) > 0 BEGIN     
      EXEC sp_executesql @stmt = @Query     
    END    
        
    
       
 END     
    
21 июн 17, 16:07    [20581067]     Ответить | Цитировать Сообщить модератору
 Re: insert into select при разных таблицах  [new]
xopc
Member

Откуда:
Сообщений: 14
Akina
xopc, надо думать не о красоте, а о корректности. Вот через пару лет изменится структура, какое-нибудь поле переименуется или переместится в структуре, или добавится во вторую таблицу, и будешь ты, как лох педальный, все свои звёздочки искать и править - оно тебе надо? Звёзды вообще где-либо, кроме COUNT(*), лучше не ставить...
А на эффективность это никак не влияет.

ладно, убедили)
22 июн 17, 00:08    [20582092]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить