|
Программирование >> Программирование баз данных
риваемой темой и ему требуется лишь освежить ее в памяти, и в связи с этим ниже приведены лишь краткие замечания. Столбец идентификации полностью пропущен (данные в этот столбец вводит система). Остальные значения заданы явно (в качестве значения EmployeelD указано 1, а для столбца Resume приведено NULL-значение). Применительно к столбцу Modif iedDate задано ключевое слово DEFAULT, которое служит указанием на то, что в этот столбец должно быть введено значение, предусмотренное по умолчанию. Теперь еще раз попытаемся выполнить тот же запрос после внесения в него изменений, касающихся отдельных столбцов: INSERT INTO HumanResources.JobCandidate (EmployeelD, Resume, ModifiedDate) VALUES (1, NULL, DEFAULT); Еще раз отметим, что значение, относящееся к столбцу идентификации, не задано. Кроме этого, в операторе ввода приведены имена конкретных столбцов; во всем остальном он полностью аналогичен применявшемуся ранее варианту. Оператор insert into. . .select Безусловно, режим работы, при котором происходит единовременно вставка только одной строки, вполне приемлем и удобен, но иногда возникает необходимость во вставке целого блока данных. В настоящей книге будет продемонстрировано несколько сценариев, в которых вставка может осуществляться таким образом, но на данный момент сосредоточимся на таком варианте, что данные, вставляемые в таблицу, формируются из других источников, подобных перечисленным ниже. Другая таблица в той же базе данных. Полностью иная база данных на том же сервере. Разнородный запрос на выборку информации из другой СУБД SQL Server или других данных. Та же таблица (в таком случае в операторе SELECT обычно предусмотрено выполнение над данными каких-либо математических операций или внесение в данные других изменений). Оператор INSERT INTO. . . SELECT позволяет решать все эти задачи. По своему синтаксису этот оператор представляет собой комбинацию двух операторов, описанных выше в данной главе, - INSERT и SELECT. Данный синтаксис выглядит примерно так: INSERT INTO <table name> [<column list>] <SELECT statement> В качестве данных, вводимых в операторе INSERT, используется результирующий набор, созданный в результате выполнения оператора SELECT. Проверим работу оператора INSERT INTO. . . SELECT на примере выборки данных, хранящихся во временной таблице, который очень часто встречается в практике программирования. В этом случае будет объявлена переменная типа таблицы и заполнена строками данных из таблицы Orders, как показано ниже. Рассматриваемый в данном примере блок кода называется сценарием. Этот конкретный сценарий состоит из одного пакета. Более подробные сведения о пакетах приведены в главе 10. /* Следующий оператор задает AdventureWorks в качестве текущей базы данных. Это позволяет обеспечить переход к использованию нужной базы данных непосредственно в коде сценария USE AdventureWorks; /* В следующем операторе содержится объявление рабочей таблицы. Данная конкретная ** таблица представляет собой переменную типа таблицы, которая объявляется ** динамически */ DECLARE ©МуТаЫе Table ( SalesOrderlD int, CustomerlD int /* После объявления переменной типа таблицы можно приступить к заполнению ее ** данными с помощью оператора SELECT. Следует учитывать, что в данном случае ** можно было бы с таким же успехом вставлять данные в постоянную таблицу (а не ** в переменную типа таблицы) */ INSERT INTO ©MyTable SELECT SalesOrderlD, CustomerlD FROM AdventureWorks.Sales.SalesOrderHeader WHERE SalesOrderlD BETWEEN 50222 AND 50225; -- Наконец, проверим, удалось ли достичь требуемых результатов вставки данных SELECT * FROM ©MyTable; После выполнения этого кода будут получены следующие результаты: (4 row(s) affected) SalesOrderlD CustomerlD 50222 638 50223 677 50224 247 50225 175 (4 row(s) affected) В данном случае обнаруживаются два сообщения (4 row (s) affected) Первое из этих сообщений является результатом промежуточного этапа выполнения оператора INSERT. . . SELECT - выборки оператором SELECT трех строк, которые должны быть вставлены в таблицу. Для проверки того, какие данные вставлены в таблицу, в этом сценарии затем непосредственно используется оператор SELECT. Следует отметить, что при попытке применить оператор SELECT к отдельно взятой таблице ©MyTable (т.е. рассматриваемой за пределами данного сценария) возникает ошибка. Дело в том, что ©MyTable - это переменная, объявленная в сценарии, которая существует только в течение прогона пакета. После этого она автоматически уничтожается. Заслуживает также внимания то, что в данном сценарии можно было бы использовать так называемую временную таблицу. Вообще говоря, такие таблицы по своему характеру аналогичны переменным, но действуют немного иначе. Дополнительная информация о временных таблицах и переменных типа таблиц приведена в главах 10 и 11. Модификация данных с помощью оператора update Оператор UPDATE, как и большинство операторов SQL, в основном выполняет такие действия, о которых говорит само его имя, - обновляет существующие данные. Структура этого оператора имеет небольшие отличия по сравнению с оператором SELECT, но между этими двумя операторами можно обнаружить определенные аналогии. Синтаксис оператора UPDATE выглядит так: UPDATE <table name> SET <coluTim> = <value> [,<coluTim> = <value>] [FROM <source table(s)>] [WHERE <restrictive condition>] Данные, применяемые в операторе UPDATE, могут быть получены из нескольких таблиц, но затем они применяются только к одной таблице. Что под этим подразумевается? В условии выборки и в самом операторе выборки может быть указано несколько разных таблиц (в таком случае для выборки данных применяется соединение), но объектом действия операции обновления может быть одновременно только одна таблица. Рассмотрим несколько простых примеров обновления. Вначале рассмотрим в качестве примера данные о сотруднике Jo Brown (который уже упоминался в примерах выполнения операции соединения выше в данной главе). В отдел кадров поступила информация о том, что Jo вступил в брак, и теперь необходимо проверить, учтены ли эти сведения в составе данных о сотруднике, хранящихся в базе данных. Ниже приведен запрос, позволяющий получить одну строку данных, содержашую все необходимые данные. SELECT е.EmployeelD, е.MaritalStatus, се.FirstName, се.LastName FROM HumanResources.Employee e JOIN Person.Contact ce ON e.ContactID = ce.ContactID WHERE ce.FirstName = Jo AND ce.LastName = Brown; Выполнение этого запроса приводит к получению следующих результатов: EmployeelD MaritalStatus FirstName LastName 16 S Jo Brovm (1 row(s) affected)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |