While mssql: MS SQL Server и T-SQL

сервер sql — SQL в то время как цикл 60 секунд?

Задавать вопрос

спросил

Изменено
2 года, 2 месяца назад

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

Я в основном пытаюсь захватить команды sql и их время ожидания для ЦП, и я просто хочу запустить цикл while в течение 60 секунд и вставить все данные во временную таблицу. Я не очень хорошо разбираюсь в курсорах или в том, как это сделать в sql.

НАЧИНАТЬ
   СОЗДАТЬ ТАБЛИЦУ #DiagTable
   (
      идентификатор сеанса NVARCHAR (МАКС.),
      имя_базы_данных NVARCHAR (МАКС.),
      время начала NVARCHAR (МАКС.),
      cmd NVARCHAR (МАКС),
      стат NVARCHAR (МАКС.),
      время процессора NVARCHAR (МАКС.),
      общее прошедшее время NVARCHAR (MAX),
      читает NVARCHAR (МАКС),
      пишет НВАРЧАР (МАКС),
      [запрос] NVARCHAR (МАКС)
   )
   ОБЪЯВИТЬ @id INT
   ЗАЯВИТЬ
      x КУРСОР ДЛЯ
         ВЫБЕРИТЕ 60
   ОТКРЫТЬ х
   ВЫБЕРИТЕ СЛЕДУЮЩИЙ ОТ x В @id
   ПОКА @@FETCH_STATUS = 0
   НАЧИНАТЬ
      ЗАДЕРЖКА ОЖИДАНИЯ '000:00:01'
      -- начать цикл здесь
      ВСТАВИТЬ В #DiagTable
         ВЫБЕРИТЕ a. session_id,
                db_name (a.database_id) КАК db_name,
                a.start_time,
                команда,
                статус,
                a.cpu_time,
                a.total_elapsed_time,
                а. читает,
                а. пишет,
                b.text AS-запрос
           ОТ sys.dm_exec_requests
                ВНЕШНЕЕ ПРИМЕНЕНИЕ sys.dm_exec_sql_text (a.sql_handle) b
          ГДЕ a.session_id > 50 -- отфильтровать фоновые задачи
                                 AND a.session_id @@spid -- отфильтровать этот сеанс запроса
         ЗАКАЗАТЬ ПО a.cpu_time DESC;
      ЗАДЕРЖКА ОЖИДАНИЯ '00:00:01'
      ВЫБЕРИТЕ СЛЕДУЮЩИЙ ОТ x В @id
   КОНЕЦ
   ЗАКРЫТЬ х
   ОСВОБОДИТЬ х
   -- конец цикла здесь
   ВЫБЕРИТЕ * ИЗ #DiagTable;
   УДАЛИТЬ ТАБЛИЦУ #DiagTable;
КОНЕЦ
 

не уверен, что я хочу выбрать 60…

  • sql-сервер

5

Чтобы выполнять скрипт каждую секунду в течение одной минуты, вы можете сделать что-то вроде этого

 DECLARE @i INT = 1;
ПОКА (@i <= 60)
 НАЧИНАТЬ
  ЗАДЕРЖКА ОЖИДАНИЯ '00:00:01'
       /*Ваш скрипт*/
 НАБОР @i = @i + 1;
КОНЕЦ
 

Я бы добавил еще один столбец во временную таблицу #DiagTable Session INT и добавил значение @i в этот столбец, чтобы отслеживать записи, вставленные каждым петля .

 -- Здесь ваш код --
ждать задержки '00:00:01'
60
 

1

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

Зарегистрируйтесь с помощью Google

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

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

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

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

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

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

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

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

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

Как выполнить цикл for или while в Databricks SQL

спросил

Изменено
1 год, 8 месяцев назад

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

Кто-нибудь знает, как написать цикл for или while в SQL в Databricks? Я пробовал много вариантов следующего кода типа SQL Server, но, похоже, ничего не работает. Я тоже не могу найти ссылку на него. Я бы предпочел не делать этого в PySpark, так как мне нужно передать вывод в дополнительный код SQL.

 DECLARE @Counter INT
УСТАНОВИТЬ @счетчик=1
ПОКА ( @Counter <= 10)
НАЧИНАТЬ
    PRINT 'Значение счетчика = ' + @Counter
    УСТАНОВИТЕ @Счетчик = @Счетчик + 1
КОНЕЦ
 

Будем признательны за любые советы.

Спасибо.

  • sql
  • циклы
  • цикл for
  • цикл while
  • блоки данных

2

Databricks SQL поддерживает только базовые запросы SQL. Таким образом, запросы, ориентированные на процедуры, не поддерживаются в текущей версии Databricks SQL. Это подпадает под новый запрос функции.

Примечание : Databricks SQL предоставляет простой интерфейс для пользователей SQL, которые хотят выполнять быстрые специальные запросы к своему озеру данных, создавать несколько типов визуализации для изучения результатов запросов с разных точек зрения, а также создавать и совместно использовать
приборные панели. Он не должен заменять рабочие нагрузки ETL, работающие в Python/PySpark, которые мы сейчас обрабатываем.

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

 # импортировать необходимые библиотеки
импорт ОС
из pyspark. sql.functions импортировать udf, col
из pyspark.sql.types импортировать IntegerType
# получить список таблиц из SQL, для синтаксиса MySQL вы можете использовать просто SHOW TABLES
df_tables = spark.read.jdbc(url=os.environ['SQL_JDBC_URL'], таблица="""(ВЫБРАТЬ
  *
ОТ
  СИСТЕМНЫЕ ОБЪЕКТЫ
ГДЕ
  xtype = 'U') x""")
# функция регистрации
определение create_df (таблица):
  
  globals () [таблица] = spark.read.jdbc (url = os.environ ['SQL_JDBC_URL'], таблица = таблица)
  вернуть глобальные()[таблица].count()
# для каждого имени из списка таблиц создать кадр данных с помощью функции
для значения в df_tables.select("name").collect():
  create_df (значение ['имя'])
 

1

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

Зарегистрируйтесь с помощью Google

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

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

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

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

Требуется, но никогда не отображается

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

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

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

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