Sql print: MS SQL Server и T-SQL

0-9];

  • \w — заменяет любую цифру, букву, а также знак нижнего подчёркивания;
  • \W — любой символ кроме латиницы, цифр или нижнего подчёркивания;
  • \s — соответствует любому пробельному символу;
  • \S — описывает любой непробельный символ.
  • Для чего используются регулярные выражения

    • для определения нужного формата, например телефонного номера или email-адреса;
    • для разбивки строк на подстроки;
    • для поиска, замены и извлечения символов;
    • для быстрого выполнения нетривиальных операций.

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

    Примечание Не стоит забывать, что регулярные выражения не всегда оптимальны, и для простых операций часто достаточно встроенных в Python функций.

    Хотите узнать больше? Обратите внимание на статью о регулярках для новичков.

    Регулярные выражения в Python

    В Python для работы с регулярками есть модуль re. Его нужно просто импортировать:

    import re

    А вот наиболее популярные методы, которые предоставляет модуль:

    • re.match()
    • re.search()
    • re.findall()
    • re.split()
    • re.sub()
    • re.compile()

    Рассмотрим каждый из них подробнее.

    re.match(pattern, string)

    Этот метод ищет по заданному шаблону в начале строки. Например, если мы вызовем метод match() на строке «AV Analytics AV» с шаблоном «AV», то он завершится успешно. Но если мы будем искать «Analytics», то результат будет отрицательный:

    import re
    result = re.match(r'AV', 'AV Analytics Vidhya AV')
    print result
    
    Результат:
    <_sre.SRE_Match object at 0x0000000009BE4370>
    

    Искомая подстрока найдена. Чтобы вывести её содержимое, применим метод group() (мы используем «r» перед строкой шаблона, чтобы показать, что это «сырая» строка в Python):

    result = re. match(r'AV', 'AV Analytics Vidhya AV')
    print result.group(0)
    
    Результат:
    AV

    Теперь попробуем найти «Analytics» в данной строке. Поскольку строка начинается на «AV», метод вернет None:

    result = re.match(r'Analytics', 'AV Analytics Vidhya AV')
    print result
    
    Результат:
    None

    Также есть методы start() и end() для того, чтобы узнать начальную и конечную позицию найденной строки.

    result = re.match(r'AV', 'AV Analytics Vidhya AV')
    print result.start()
    print result.end()
    
    Результат:
    0
    2

    Эти методы иногда очень полезны для работы со строками.

    re.search(pattern, string)

    Метод похож на match(), но ищет не только в начале строки. В отличие от предыдущего, search() вернёт объект, если мы попытаемся найти «Analytics»:

    result = re.search(r'Analytics', 'AV Analytics Vidhya AV')
    print result.group(0)
    
    Результат:
    Analytics

    Метод search() ищет по всей строке, но возвращает только первое найденное совпадение.

    re.findall(pattern, string)

    Возвращает список всех найденных совпадений. У метода findall() нет ограничений на поиск в начале или конце строки. Если мы будем искать «AV» в нашей строке, он вернет все вхождения «AV». Для поиска рекомендуется использовать именно findall(), так как он может работать и как re.search(), и как re.match().

    result = re.findall(r'AV', 'AV Analytics Vidhya AV')
    print result
    
    Результат:
    ['AV', 'AV']

    re.split(pattern, string, [maxsplit=0])

    Этот метод разделяет строку по заданному шаблону.

    result = re.split(r'y', 'Analytics')
    print result
    
    Результат:
    ['Anal', 'tics']

    В примере мы разделили слово «Analytics» по букве «y». Метод split() принимает также аргумент maxsplit со значением по умолчанию, равным 0. В данном случае он разделит строку столько раз, сколько возможно, но если указать этот аргумент, то разделение будет произведено не более указанного количества раз. Давайте посмотрим на примеры Python RegEx:

    result = re.split(r'i', 'Analytics Vidhya')
    print result
    
    Результат:
    ['Analyt', 'cs V', 'dhya'] # все возможные участки.
    result = re.split(r'i', 'Analytics Vidhya',maxsplit=1)
    print result
    
    Результат:
    ['Analyt', 'cs Vidhya']

    Мы установили параметр maxsplit равным 1, и в результате строка была разделена на две части вместо трех.

    re.sub(pattern, repl, string)

    Ищет шаблон в строке и заменяет его на указанную подстроку. Если шаблон не найден, строка остается неизменной.

    result = re.sub(r'India', 'the World', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    'AV is largest Analytics community of the World'

    re.compile(pattern, repl, string)

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

    pattern = re.compile('AV')
    result = pattern.findall('AV Analytics Vidhya AV')
    print result
    result2 = pattern.findall('AV is largest analytics community of India')
    print result2
    
    Результат:
    ['AV', 'AV']
    ['AV']

    До сих пор мы рассматривали поиск определенной последовательности символов. Но что, если у нас нет определенного шаблона, и нам надо вернуть набор символов из строки, отвечающий определенным правилам? Такая задача часто стоит при извлечении информации из строк. Это можно сделать, написав выражение с использованием специальных символов. Вот наиболее часто используемые из них:

    ОператорОписание
    .Один любой символ, кроме новой строки \n.
    ?0 или 1 вхождение шаблона слева
    +1 и более вхождений шаблона слева
    *0 и более вхождений шаблона слева
    \wЛюбая цифра или буква (\W — все, кроме буквы или цифры)
    \dЛюбая цифра [0-9] (\D — все, кроме цифры)
    \sЛюбой пробельный символ (\S — любой непробельный символ)
    \bГраница слова
    [. и $Начало и конец строки соответственно
    {n,m}От n до m вхождений ({,m} — от 0 до m)
    a|bСоответствует a или b
    ()Группирует выражение и возвращает найденный текст
    \t, \n, \rСимвол табуляции, новой строки и возврата каретки соответственно

    Больше информации по специальным символам можно найти в документации для регулярных выражений в Python 3.

    Перейдём к практическому применению Python регулярных выражений и рассмотрим примеры.

    Задачи

    Вернуть первое слово из строки

    Сначала попробуем вытащить каждый символ (используя .)

    result = re.findall(r'.', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['A', 'V', ' ', 'i', 's', ' ', 'l', 'a', 'r', 'g', 'e', 's', 't', ' ', 'A', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', ' ', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', ' ', 'o', 'f', ' ', 'I', 'n', 'd', 'i', 'a']

    Для того, чтобы в конечный результат не попал пробел, используем вместо . \w.

    result = re.findall(r'\w', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['A', 'V', 'i', 's', 'l', 'a', 'r', 'g', 'e', 's', 't', 'A', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', 'o', 'f', 'I', 'n', 'd', 'i', 'a']

    Теперь попробуем достать каждое слово (используя * или +)

    result = re.findall(r'\w*', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', '', 'is', '', 'largest', '', 'Analytics', '', 'community', '', 'of', '', 'India', '']

    И снова в результат попали пробелы, так как * означает «ноль или более символов». Для того, чтобы их убрать, используем +:

    result = re.findall(r'\w+', 'AV is largest Analytics community of India')
    print result
    Результат:
    ['AV', 'is', 'largest', 'Analytics', 'community', 'of', 'India']

    Теперь вытащим первое слово, используя ^:

    result = re. , то мы получим последнее слово, а не первое:

    result = re.findall(r'\w+$', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    [‘India’]

    Вернуть первые два символа каждого слова

    Вариант 1: используя \w, вытащить два последовательных символа, кроме пробельных, из каждого слова:

    result = re.findall(r'\w\w', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'la', 'rg', 'es', 'An', 'al', 'yt', 'ic', 'co', 'mm', 'un', 'it', 'of', 'In', 'di']

    Вариант 2: вытащить два последовательных символа, используя символ границы слова (\b):

    result = re.findall(r'\b\w.', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'la', 'An', 'co', 'of', 'In']

    Вернуть домены из списка email-адресов

    Сначала вернём все символы после «@»:

    result = re.findall(r'@\w+', 'abc. [email protected], [email protected], [email protected], [email protected]')
    print result
    
    Результат:
    ['@gmail', '@test', '@analyticsvidhya', '@rest']

    Как видим, части «.com», «.in» и т. д. не попали в результат. Изменим наш код:

    result = re.findall(r'@\w+.\w+', '[email protected], [email protected], [email protected], [email protected]')
    print result
    
    Результат:
    ['@gmail.com', '@test.in', '@analyticsvidhya.com', '@rest.biz']

    Второй вариант — вытащить только домен верхнего уровня, используя группировку — ( ):

    result = re.findall(r'@\w+.(\w+)', '[email protected], [email protected], [email protected], [email protected]')
    print result
    
    Результат:
    ['com', 'in', 'com', 'biz']

    Извлечь дату из строки

    Используем \d для извлечения цифр.

    result = re.findall(r'\d{2}-\d{2}-\d{4}', 'Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009')
    print result
    
    Результат:
    ['12-05-2007', '11-11-2011', '12-01-2009']

    Для извлечения только года нам опять помогут скобки:

    result = re. findall(r'\d{2}-\d{2}-(\d{4})', 'Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009')
    print result
    
    Результат:
    ['2007', '2011', '2009']

    Извлечь слова, начинающиеся на гласную

    Для начала вернем все слова:

    result = re.findall(r'\w+', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'largest', 'Analytics', 'community', 'of', 'India']

    А теперь — только те, которые начинаются на определенные буквы (используя []):

    result = re.findall(r'[aeiouAEIOU]\w+', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'argest', 'Analytics', 'ommunity', 'of', 'India']

    Выше мы видим обрезанные слова «argest» и «ommunity». Для того, чтобы убрать их, используем \b для обозначения границы слова:

    result = re.findall(r'\b[aeiouAEIOU]\w+', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'Analytics', 'of', 'India']

    Также мы можем использовать ^ внутри квадратных скобок для инвертирования группы:

    result = re. aeiouAEIOU ]\w+', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['largest', 'community']

    Проверить формат телефонного номера

    Номер должен быть длиной 10 знаков и начинаться с 8 или 9. Есть список телефонных номеров, и нужно проверить их, используя регулярки в Python:

    li = ['9999999999', '999999-999', '99999x9999']
    
    for val in li:
        if re.match(r'[8-9]{1}[0-9]{9}', val) and len(val) == 10:
            print 'yes'
        else:
            print 'no'
    
    Результат:
    yes
    no
    no

    Разбить строку по нескольким разделителям

    Возможное решение:

    line = 'asdf fjdk;afed,fjek,asdf,foo' # String has multiple delimiters (";",","," ").
    result = re.split(r'[;,\s]', line)
    print result
    
    Результат:
    ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

    Также мы можем использовать метод re.sub() для замены всех разделителей пробелами:

    line = 'asdf fjdk;afed,fjek,asdf,foo'
    result = re. sub(r'[;,\s]',' ', line)
    print result
    
    Результат:
    asdf fjdk afed fjek asdf foo

    Извлечь информацию из html-файла

    Допустим, нужно извлечь информацию из html-файла, заключенную между <td> и </td>, кроме первого столбца с номером. Также будем считать, что html-код содержится в строке.

    Пример содержимого html-файла:

    1NoahEmma2LiamOlivia3MasonSophia4JacobIsabella5WilliamAva6EthanMia7MichaelEmily

    С помощью регулярных выражений в Python это можно решить так (если поместить содержимое файла в переменную test_str):

    result = re.findall(r'\d([A-Z][A-Za-z]+)([A-Z][A-Za-z]+)', test_str)
    print result
    
    Результат:
    [('Noah', 'Emma'), ('Liam', 'Olivia'), ('Mason', 'Sophia'), ('Jacob', 'Isabella'), ('William', 'Ava'), ('Ethan', 'Mia'), ('Michael', 'Emily')]

    Адаптированный перевод «Beginners Tutorial for Regular Expressions in Python»

    сервер sql - инструкция PRINT в T-SQL

    спросил

    Изменено
    2 года назад

    Просмотрено
    322к раз

    Почему оператор PRINT в T-SQL работает лишь иногда? Каковы ограничения на его использование? Иногда кажется, что если набор результатов сгенерирован, он становится нулевой функцией, я предполагал, чтобы предотвратить повреждение набора результатов, но может ли его вывод не выходить в другой набор результатов, например, количество строк?

    • sql-сервер
    • tsql

    1

    Итак, если у вас есть утверждение, похожее на следующее, вы говорите, что не получаете результата «печати»?

     выберите * из системных объектов
    PRINT 'Just selected * from sysobjects' 

    Если вы используете SQL Query Analyzer, вы увидите, что внизу есть две вкладки, одна из которых — «Сообщения», и именно здесь будут отображаться операторы «печати». вверх.
    Если вас беспокоит время просмотра операторов печати, вы можете попробовать использовать что-то вроде

     raiserror («Мое заявление на печать», 10,1) с nowait 

    Это немедленно даст вам сообщение по мере достижения оператора, а не буферизовать вывод, как это делает анализатор запросов в большинстве случаев.

    5

    Оператор Print в TSQL является непонятым созданием, вероятно, из-за его имени. На самом деле он отправляет сообщение механизму обработки ошибок/сообщений, который затем передает его вызывающему приложению. PRINT довольно тупой. Вы можете отправить только 8000 символов (4000 символов Юникода). Вы можете отправить литеральную строку, строковую переменную (varchar или char) или строковое выражение. Если вы используете RAISERROR, то вы ограничены строкой всего в 2044 символа. Однако гораздо проще использовать его для отправки информации вызывающему приложению, поскольку он вызывает функцию форматирования, аналогичную старой функции printf в стандартной библиотеке C. RAISERROR также может указывать номер ошибки, серьезность и код состояния в дополнение к текстовому сообщению, а также может использоваться для возврата пользовательских сообщений, созданных с помощью системной хранимой процедуры sp_addmessage. Вы также можете принудительно регистрировать сообщения.

    Ваши процедуры обработки ошибок не годятся для получения сообщений, несмотря на то, что сообщения и ошибки очень похожи. Техника, конечно, различается в зависимости от фактического способа подключения к базе данных (OLBC, OLEDB и т. д.). Чтобы получать и обрабатывать сообщения от ядра СУБД SQL Server, при использовании System.Data.SQLClient необходимо создать делегат SqlInfoMessageEventHandler, указав метод, обрабатывающий событие, для прослушивания события InfoMessage. в классе SqlConnection. Вы обнаружите, что информация о контексте сообщения, такая как серьезность и состояние, передается в качестве аргументов функции обратного вызова, потому что с точки зрения системы эти сообщения подобны ошибкам.

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

    Query Analyzer буферизует сообщения. Операторы PRINT и RAISERROR используют этот буфер, но оператор RAISERROR имеет параметр WITH NOWAIT. Для немедленной печати сообщения используйте следующее:

     RAISERROR («Ваше сообщение», 0, 1) WITH NOWAIT
     

    RAISERROR будет отображать только 400 символов вашего сообщения и использует синтаксис, аналогичный функции C printf для форматирования текста.

    Обратите внимание, что использование RAISERROR с опцией WITH NOWAIT очистит буфер сообщений, поэтому вся ранее буферизованная информация также будет выведена.

    1

    Недавно я столкнулся с этим, и в итоге это произошло из-за того, что у меня был оператор convert для нулевой переменной. Поскольку это вызывало ошибки, весь оператор печати отображался как null и вообще не печатался.

    Пример - Это не удастся:

     объявить @myID int=null
    print 'Первое утверждение: ' + convert(varchar(4), @myID)
     

    Пример. Будет напечатано:

     declare @myID int=null
    print 'Второе утверждение: ' + объединение (Convert (varchar (4), @myID), '@myID равно null')
     

    1

    Для всех, кто читает этот вопрос, у кого действительно отсутствуют операторы печати в их выходных данных, на самом деле бывают случаи, когда печать выполняется, но не возвращается клиенту. Я не могу сказать вам конкретно, что они собой представляют. Я могу сказать вам, что если вы поместите оператор go непосредственно перед любым оператором печати и после него, вы увидите, выполняется ли он.

    2

    Были ли выведены переменные, связанные с этими операторами печати? если это так, я обнаружил, что если переменная не имеет значения, то оператор печати не будет выводиться.

    1

    Зарегистрируйтесь или войдите

    Зарегистрироваться через Google

    Зарегистрироваться через Facebook

    Зарегистрируйтесь, используя электронную почту и пароль

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

    Оператор SQL Server PRINT — обзор с примерами

    ГлавнаяРазработка баз данных, ОператорыОбзор оператора PRINT в SQL Server

    Оператор SQL PRINT служит для отображения определяемого пользователем сообщения. Например, вы разрабатываете сценарий с использованием циклов T-SQL и хотите отображать определенное сообщение при каждой итерации цикла. Затем вы можете использовать оператор PRINT. Или вы можете использовать его при разработке скрипта с условными операторами. В этом случае вы гарантируете, что условие, оцениваемое оператором, выполняет правильный шаг или генерирует правильный вывод. Оператор PRINT также можно использовать для отслеживания процесса запроса T-SQL или хранимой процедуры или для возврата настроенного сообщения.

    В данной статье рассматриваются следующие варианты использования:

    1. Печать строки или значения int с помощью инструкции PRINT.
    2. Использование PRINT в операторе IF…ELSE.
    3. Использование PRINT в цикле WHILE.

    Синтаксис оператора PRINT следующий:

     Строка печати | @переменная | str_expression 
    • строка : значение может быть символом или строкой Unicode.
    • @переменная : Символьный тип данных должен быть символьным или символьным типом данных Unicode.
    • str_expression : значение может быть выражением, возвращающим строку. Это может быть буквальное значение, строковая функция и переменная.

    Когда мы используем оператор PRINT для отображения определенного значения, выходные данные возвращаются в панель сообщений студии управления SQL Server.

    Примечание: Оператор PRINT может отображать строку длиной 8000 символов или строку Unicode длиной 4000 символов . Если длина превышает 8000, оставшаяся строка будет усечена.

    Ограничения оператора PRINT

    1. Функция PRINT возвращает строку символов или строку символов UNICODE. Следовательно, при объединении типов данных string и Integer мы должны явно преобразовать значение INT в тип данных char или varchar.
    2. Профилировщик SQL Server не фиксирует операторы PRINT.

    Пример: вывести строковое значение

    Предположим, вы хотите написать выражение, которое выводит на экран Hello, World . T-SQL должен быть следующим:

     Распечатать «Hello World» 

    Вывод:

    Чтобы распечатать значение, хранящееся в переменной @string , нам нужен следующий код:

     declare @String varchar( 30)
    установить @String = 'Привет, мир'
    Печать @String
     

    Вывод:

    Распечатать целочисленное значение с помощью оператора PRINT

    Используйте следующий сценарий T-SQL:

     Print 10 

    Вывод:

    Чтобы напечатать значение параметра @intvalue , используйте следующий сценарий T-SQL. Тип данных @intvalue является целым числом.

     объявить @IntValue Int
    установить @IntValue = 10
    Распечатать @IntValue
     

    Вывод:

    Вы можете выполнять основные арифметические операции с помощью оператора PRINT. Предположим, вы хотите выполнить СУММУ двух значений. Вы можете сделать это, добавив знак плюс (+) между двумя числовыми значениями:

     Печать 10+10 

    Вывод:

    Печать пользовательских сообщений с помощью оператора PRINT

    Предположим, вы хотите распечатать текущее время с помощью оператора PRINT. Для этого мы объявляем две переменные SQL PRINT с именами @inputstring и @currentdate . Тип данных @inputstring : varchar(50), и @currentdate : дата-время . Запрос следующий:

     объявить @inputstring varchar(500)
    объявить @currentdate datetime
    set @inputstring = 'Время '
    установить @currentdate= (выбрать getdate())
    Распечатать @inputstring + @currentdate
     

    Вывод:

    Произошла ошибка. Чтобы исправить эту ошибку, мы должны явно преобразовать значение, хранящееся в переменной @currentdate . Сценарий T-SQL должен выглядеть следующим образом:

     объявлять @inputstring varchar(500)
    объявить @currentdate datetime
    set @inputstring = 'Время '
    установить @currentdate= (выбрать getdate())
    Распечатать @inputstring + convert(varchar,@currentdate,103)
     

    Вывод:

    Использование оператора PRINT в операторе IF…ELSE

    Теперь давайте напечатаем Hello World на основе условия, указанного в цикле IF…ELSE. Если условие оценивается как ИСТИНА, то выведите Hello World . Если он оценивает FALSE, то выведите Hello India .

     если (0=0)
    напечатать «Привет, мир»
    еще
    Печать «Привет, Индия»
     

    Вывод:

    Точно так же вы можете использовать значения, хранящиеся в переменной T-SQL, для сравнения и печати вывода.

    Я создал хранимую процедуру, которая проверяет состояние базы данных. Если он онлайн, он печатает ONLINE. В противном случае он печатает ERROR. Я передаю database_id в качестве входного параметра.

    Код T-SQL хранимой процедуры выглядит следующим образом:

     создать процедуру getDBStatus
    @DatabaseID целое число
    как
    начинать
    объявить @DBStatus varchar(20)
    set @DBStatus=(выберите state_desc из sys.databases, где [электронная почта защищена])
    если @DBStatus='ОНЛАЙН'
    Вывести 'База данных ОНЛАЙН'
    еще
    Вывести «База данных находится в состоянии ОШИБКА».
    Конец
     

    Выполнение хранимой процедуры:

     Exec getDBStatus 5 

    Вывод:

    Теперь давайте проверим условие ELSE. Запустите хранимую процедуру, используя другое значение параметра @ databaseID :

     использовать мастер
    идти
    exec getDBStatus 6
     

    Вывод:

    Использование оператора PRINT в цикле WHILE

    Предположим, вы хотите напечатать Hello World 10 раз. Затем вы можете использовать цикл WHILE. Ниже приведен код T-SQL для многократной печати hello world:

     Объявить @i int =0
    объявить @iterations int = 10
    Пока (@i<@iterations)
    Начинать
    Распечатать «Привет, мир»
    установить @[email protected]+1
    Конец
     

    Вывод:

    Теперь давайте разработаем сценарий для запроса T-SQL, создающего резервную копию всех пользовательских баз данных. Чтобы просмотреть ход выполнения скрипта, мы используем оператор PRINT.

    В сценарии мы будем использовать следующую переменную SQL:

    1. @DBcount содержит количество пользовательских баз данных. Тип данных — целое число.
    2. @i содержит возрастающие значения. Тип данных — целое число.
    3. @DBName содержит значение имени базы данных. Тип данных — varchar(200).
    4. @SQLCommand содержит команду Backup database . Тип данных — nvarchar(max).
    5. #Databases — это временная таблица. Мы вставляем имя пользовательских баз данных.

    Сначала сценарий создает временную таблицу с именем # Базы данных и вставляет в нее имя пользовательской базы данных.

     создать таблицу #Базы данных (имя varchar(200))
    вставить в #Databases выбрать имя из sys. databases, где database_id>4
     

    Затем он заполняет количество пользовательской базы данных и сохраняет значение в параметре @DBCount :

     set @DBCount=(выберите количество(1) из #Databases) имя базы данных. Цикл WHILE выполняется до тех пор, пока значения   @i   и   @DBCount   становятся эквивалентными. 

     WHILE (@DBCount>@i) 

    В цикле WHILE мы используем предложение TOP, чтобы получить имя базы данных из таблицы #Databases и сохранить его в переменной @DBName .

     Начало
    set @DBName=(выберите первое имя из #Databases)
     

    После этого создается динамическая команда T-SQL. Он устанавливает значение @DBName параметр в динамическом SQL.

     set @SQLCommand = 'Резервная копия базы данных [' [email protected]+'] to disk = ''D:\Backup\' + @DBName +'.bak''' 

    Чтобы проверить правильность запроса резервной копии базы данных мы добавили оператор PRINT, который возвращает значение переменной @SQLCommand .

     Print @SQLCommand 

    Следующая инструкция увеличивает значение @I на единицу и удаляет запись с именем, хранящимся в @DBName переменная.

     удалить из #Баз, где [электронная почта защищена]
    установить @[электронная почта защищена] + 1
    Конец
     

    Полный сценарий выглядит следующим образом:

     set nocount on
    объявить @DBCount int
    объявить @i int = 0
    объявить @DBName varchar (200)
    объявить @SQLCommand nvarchar(max)
    создать таблицу #Databases (имя varchar(200))
    вставить в #Databases выбрать имя из sys.databases, где database_id>4
    set @DBCount=(выберите count(1) из #Databases)
    ПОКА (@DBCount>@i)
    Начинать
    set @DBName=(выберите первое имя из #Databases)
    set @SQLCommand = 'Резервная копия базы данных [' [email protected]+'] to disk = ''D:\Backup\' + @DBName +'.bak'''
    Печать @SQLCommand
    удалить из #Databases, где [email защищено]
    установить @[электронная почта защищена] + 1
    Конец
    удалить таблицу #Базы данных
     

    Результат сценария приведен ниже:

    Мы можем использовать приведенный выше сценарий для подготовки специального сценария для резервного копирования всех пользовательских баз данных.