Как вывести переменную в sql
Перейти к содержимому

Как вывести переменную в sql

  • автор:

SQL. Как передать значение поля таблицы в переменную

Пишу на T-Sql триггер, срабатывающий на добавление в таблицу Table1 новой строки. Каждый столбец этой строки содержит имя другой таблицы: Table2, Table3 и т.д. В эти самые таблицы (Table2, Table3 и т.д.) мне нужно вставить новые строки, значения которых вычисляются в триггере. Проблема следующая: у меня не получается заполнить динамически значение переменной, которая должна содержать в себе имя Table2 или Table3. Вместо этого переменная @TableName содержит в себе следующее: ‘select column1 from Table1 where num_string = sn’, где column1 — значение текстовой переменной, sn — значение числовой переменной. Дальше по коду триггера мне нужно вставить строки в таблицу Table2 или Table3 в зависимости от того, какое значение я выбрал динамически. Но в итоге падает ошибка о неправильном синтаксисе возле слова insert, ведь когда я пытаюсь динамически выполнить следующую переменную на заполнение, то в ней получается текст ‘insert into select colomn1. ‘ вместо ‘insert into Table2. ‘ Написано все таким образом:

Set @tablename = 'select '+@num_col+' from Table1 where num_string = '+cast(@num_string as nvarchar(99))+'' exec sp_executesql @tablename Set @insert = 'insert into '+@tablename+' values(' +@a+','+@b')' exec sp_executesql @insert 

Что я делаю не так? Спасибо за помощь

Отслеживать

16.4k 2 2 золотых знака 15 15 серебряных знаков 24 24 бронзовых знака

2.20. Переменные

Язык запросов Transact-SQL отличается не только мощной поддержкой транзакций, но и поддержкой переменных, благодаря которым, становиться возможным создание более сложных запросов и даже целых программ. Переменные есть и в других вариантах языка SQL (в том числе и PL/SQL), поэтому это не индивидуальное преимущество именно MS SQL Server.

Переменные – элементы языка с присвоенными значениями. Если честно, то такое определение мне не очень нравиться, потому что не отражает суть переменных и абсолютно не понятно, что это и для чего нужно. Чтобы понять, что такое переменная, нужно вспомнить, как данные хранятся в памяти.

Когда вы заносите в компьютер какое-то число или строку, то в оперативной памяти для хранения этих данных выделяется участок памяти. Эта память имеет числовой адрес, а как известно, числа запоминать намного сложнее. Лично я могу помнить не более 10 номеров телефонов, а все остальное записываю в блокнот. Понятные слова запоминаются лучше и с ними проще работать. Чтобы обратиться к данным в памяти, необходимо указать адрес, по которому находятся нужное нам число или строка.

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

Вы объявляете локальные переменные в операторе DECLARE и после этого назначаете ему индивидуальное значение с помощью операторов SET или SELECT. Используйте оператор SET, когда желаемое значение известно, а оператор SELECT, когда вам нужно получить желаемое значение из таблицы. После того, как вы назначили переменное значение, вы можете использовать его в операторах, группах и процедурах, в которых они объявлены. Группы — это набор операторов Transact-SQL, которые отправляются вместе и исполняются как группа (несколько последовательно выполняемых команд). Мы не раз уже использовали группы, и вы их можете увидеть в листингах 2.9, 2.10 и так далее.

Имя локальной переменной начинается с одного символом @ в начале имени. Общий вид объявления переменной:

DECLARE [. n]

Пример установки переменной значения:

SET @имя = значение

После ключевого слова указывается локальная переменная (@имя). Далее идет знак равенства и значение, которое должно быть присвоено переменной.

Следующий пример объявляет две переменные и использует их:

Листинг 2.13. Пример использования переменных

-- Объявляем две переменные @vLastName и @vFirstName, -- которые имеют тип varchar размером в 50 символов DECLARE @vLastName varchar(50), @vFirstName varchar(50) -- Устанавливаем переменную фамилии @vLastName SET @vLastName='%СИДОРОВ' -- Выбираем имя работника из таблицы и записываем его в -- переменную @vFirstName SELECT @vFirstName = vcName FROM tbPeoples WHERE vcFamil LIKE @vLastName -- Печатаем результат PRINT 'Имя Cидорова '+@vFirstName

В результате на экране мы должны увидеть сообщение:

Имя Cидорова ИВАН

Теперь посмотрим, что происходит в сценарии. Сначала мы объявляем две переменные. Это можно сделать двумя способами. Первый – после ключевого слова DECLARE перечислить через запятую имена переменных и их тип, как показано в листинге 2.13. Напоминаю, что имя переменной должно начинаться с @.

Второй способ – каждую переменную описать в отдельной секции DECLARE:

DECLARE @vLastName varchar(50) DECLARE @vFirstName varchar(50)

Теперь переменной @vLastName, которая должна хранить фамилию работника, присваиваем значение ‘%СИДОРОВ’. Вначале фамилии стоит знак %, потому что в конце раздела 2.17 мы прибавили в начало каждой фамилии буквы mr. Если вы выполняли этот запрос, то обязательно необходимо добавить знак процента или переменной присвоить значение ‘mr.СИДОРОВ’.

Теперь выполняем запрос SELECT. Давайте рассмотрим его построчно:

  1. SELECT @vFirstName = vcName – после оператора SELECT, указываем, что необходимо значение поля «vcName» присвоить переменной @vFirstName;
  2. FROM tbPeoples – данные выбираются из таблицы tbPeoples;
  3. WHERE vcFamil LIKE @vLastName – в условии поиска мы указываем, что поле «vcFamil» должно соответствовать содержимому шаблона в переменной @vLastName.

Новой для нас является и последняя строка, в которой происходит вывод на экран сообщения с помощью оператора PRINT. После оператора указывается сообщение, которое необходимо вывести. Сообщение может быть указано через пробел или в скобках. Следующий пример показывает, как использовать сообщение в скобках:

print('Команда недопустима')

Содержимое переменной можно использовать и в качестве имени транзакции. В следующем примере, мы объявляем переменную @Transname, присваиваем ей значение, и используем в качестве имени транзакции:

DECLARE @Transname varchar(50) BEGIN TRANSACTION @Transname INSERT INTO tbPeoples(vcFamil, vcName) VALUES('ВАСИЛЬКОВ', 'ИВАН') COMMIT TRANSACTION @Transname

Глобальные переменные начинаются с двух символов @@. Когда вы создаете собственные программы на языке Transact-SQL, то рекомендую использовать только локальные переменные, чтобы случайно не спровоцировать конфликта имен или значений. Так как глобальные переменные доступны всем, то их может увидеть любой пользователь, подключенный в данный момент к серверу.

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

  1. @@SERVERNAME – содержит имя экземпляра MS SQL Server;
  2. @@VERSION – информация о версии SQL Server;
  3. @@ROWCOUNT – содержит количество строк, обработанных последней выполненной командой;
  4. @@SPID – идентификатор текущего процесса;
  5. @@TRANCOUNT – уровень вложенности транзакций;
  6. @@NESTLEVEL – уровень вложенности при выполнении хранимых процедур и триггеров;
  7. @@OPTIONS – текущие настройки серверных параметров;
  8. @@ERROR – содержит код ошибки последней выполненной команды;
  9. @@IDENTITY – последнее значение счетчика, которое было использовано после добавления строки.
  10. @@CURSOR_ROWS – возвращает количество записей, полученных последней командой открытия курсора.

В следующих главах мы еще будем возвращаться к глобальным переменным и некоторые из них рассмотрим более подробно. Рассматривать все переменные сейчас не имеет смысла, потому что у нас еще не достаточно информации о языке Transact-SQL и базе данных MS SQL Server. А сейчас ограничимся только общими понятиями и простым примером.

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

SELECT @@SERVERNAME

В моем случае я увидел в качестве результата строку с единственным безымянным полем, в котором находился текст: CYD\FLENOV.

Как вывести переменную в sql

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

insert into MyTable values (1, 'teststring', NULL, '8-May-2004')
update MyTable set MyField = null where YourField = -1
if (Number = 0) then MyVariable = null;

— « Минуточку. но вы сказали, что MyField = NULL было недопустимо! »

Это верно. для оператора сравнения « = » (по крайней мере для СУБД Firebird до версии 2.0). Но здесь мы говорим о знаке « = », как об операторе присваивания . К сожалению, в SQL оба эти оператора имеют один и тот же символ. В случае присваивания, которое выполняется с помощью « = » или внутри списка вставки, вы можете трактовать NULL , как любое другое значение, — специальный синтаксис не требуется.

Firebird Documentation Index → NULL в СУБД Firebird → Установка значения поля или переменной в NULL

Как можно выполнить команду sql, записанную в переменную?

Как можно запустить выполнение команды из переменных $k, не записывая вручную напрямую echo «Hello»; ?

P.s. У меня sql команды находятся в базе sql и выводятся через переменные.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

SQLite: как выполнить команду, чтобы получить в int переменную количество строк в таблице
конкретный вопрос вот в чем command.CommandText = @"SELECT COUNT(clientID) FROM clients"; как.

SQL Server 2000 как в файле sql строковую переменную выполнить как инструкцию
Добрый день! Подскажите пожалуйста, как строковую переменную выполнить как инструкцию, например: .

Как можно выполнить команду COPY так, чтобы созданный файл запускал обе программы?
как можно выполнить команду copy /b D:\3.exe + D:\33.exe D:\333.exe так, чтобы файл 333 запускал.

Как можно считать динамическую переменную и выполнить shell code?
есть переменная которая содержит шел код, необходимо ее считать так чтобы он выполнился, при этом.

Регистрация: 14.05.2011
Сообщений: 27
Нужно вывести только результат выполнения команды из переменной, в данном случае только Hello
Изображения
Регистрация: 14.05.2011
Сообщений: 27
Ответ: eval($k);
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211

ЦитатаСообщение от Viktor_ Посмотреть сообщение

Ответ: eval($k);
это опасный вариант

Эксперт PHP

3834 / 3182 / 1337
Регистрация: 01.08.2012
Сообщений: 10,788

Viktor_, как написали выше, выполнение строк как команд в PHP опасная вещь, лучше поискать другое решение. Опишите исходную задачу.

Регистрация: 14.05.2011
Сообщений: 27

У меня предложение строится из слов, которые выдергиваются рандомно из таблицы бд. Количество вариантов несколько тысяч. Начал выдавать ошибку, нет памяти. Решил перенести шаблоны в бд.

1 2 3 4
if ($k == 0 ) $word.=mb_convert_case(a('prilag1'),MB_CASE_TITLE).' '.a('sush1').' '.a('narechie1').' '.a('glagol1').' '.a('souz').' '.a('prilag2').' '.a('sush2').' '.a('narechie2').' '.a('glagol2').' (0)'; else if ($k == 1 ) $word.=mb_convert_case(a('prilag1'),MB_CASE_TITLE).' '.a('sush1').' '.a('narechie1').' '.a('glagol1').' '.a('souz').' '.a('prilag2').' '.a('sush2').' '.a('narechie2').' '.a('glagol2').' (1)';

209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
дичь вы какую-то лепите
Регистрация: 14.05.2011
Сообщений: 27

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

209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
ну так вытащите рандомные слова из БД одним запросом и сделайте

$row = $res->fetch_array(); $str = implode(' ', $row);

а ещё лучше функцию внутри БД написать, которая будет готовые предложения выдавать.

ну а у вас дичь из кучи вызовов каких-то внешних функций, каждая из которых походу делает запрос

ps: mb_convert_case() тоже делается в БД.

Регистрация: 14.05.2011
Сообщений: 27

Я не потяну. Может посмотрит кто-нибудь код с базой, index.php при $k=1420 работает, а при $k=1423 уже нет.

Вложения

3.ru — копия.rar (18.6 Кб, 4 просмотров)

209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211

я это тоже не потяну. Это выше моих сил (
весь массив должен быть в бд, а не вот это всё
нахрена вы из пхп базу данных сделали?!
нахрена писать 100500 строк, когда в цикле можно запустить??
нахрена за каждым словом в БД лазать? Это самая тяжёлая операция — в БД ходить!

767 / 323 / 157
Регистрация: 26.05.2016
Сообщений: 2,127

ЦитатаСообщение от полудух Посмотреть сообщение

нахрена вы в пхп базу данных сделали?!
Регистрация: 14.05.2011
Сообщений: 27
А запустить получилось? Мне бы просто ехать, без шачешек
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211

если я правильно понял, у вас там вся эта каша только для того, чтобы вывести предложение из рандомных слов, которые лежат в отдельных таблицах такого плана:
‘prilag1’,
‘prilag2’,
‘sush1’,
‘sush2’,
‘narechie1’,
‘narechie2’,
‘glagol1’,
‘glagol2’,
‘souz’,
‘souz2’,
‘tab1’

и походу каждому слову ещё надо транслитерацию сделать.
ещё Goroda какие-то, которые толи в файлах, толи не в файлах. всё должно быть в БД!
cp1251 там что делает?

лучше напишите исходные данные, и что хотите получить, а также примеры таблиц (первые 5 строк из glagol1, glagol2, city_pgt)
никто не будет эту кашу ковырять.

зы: $_SERVER[‘HTTP_HOST’] — это юзерская переменная, её юзер может менять. Надо юзать ‘SERVER_NAME’ — это серверная переменная.

Регистрация: 14.05.2011
Сообщений: 27

В общем, решил задачу.
1. Создаем в базе записи строк такого рода. Это шаблоны для создания предложения из рандомных выборок:

Раньше это было прописано в коде через генерацию случайных чисел if $k=1 так, $к=2 эсяк.

2. Получаем из БД случайно строку одного из шаблона: $yy=a(‘generate’);

3. Созраняем в файл, так как eval почему-то не работает с функцией а (случайная выборка записи): file_put_contents(‘random.txt’,$yy);

4. Подключаем файл: include ‘random.txt’;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *