Пакеты и переменные
Переменные локальны по отношению к пакету, в котором определены. Если сослаться на переменную, определенную в другом пакете, то получите ошибку, сообщающую о том, что переменная не определена. Например, в следующем программном коде в одном пакете переменная объявлена и выведена на печать, а другом пакете делается попытка напечатать эту переменную. DECLARE @i AS INT; SET @i = 10; --Успешная попытка PRINT @i; GO --Неудачная попытка PRINT @i; Ссылка на переменную в первой инструкции print корректна, т. к. она появляется в том же пакете, где объявлена переменная, а вторая ссылка не корректна. Таким образом, первая инструкция print вернет значение переменной (10), а вторая завершится аварийно. Результат: Msg 137, Level 15, State 2, Line 3 Must declare the scalar variable "@i".
Инструкции, которые не могут комбинироваться в одном пакете Следующие инструкции не могут комбинироваться с другими инструкциями в одном и той же пакете: create default, create function, create procedure, create rulE, create schema, create trigger и create vieW.
Например, в следующем программном коде есть инструкция if, за которой идет инструкция create view в том же самом пакете, и, следовательно, она не допустима. IF OBJECT_ID('Sales.MyView', 'V') IS NOT NULL DROP VIEW Sales.MyView;
CREATE VIEW Sales.MyView AS SELECT YEAR(orderdate) AS orderyear, COUNT(*) AS numorders FROM Sales.Orders GROUP BY YEAR(orderdate); GO--один пакет
Попытка выполнить этот программный код приведет к сообщению об ошибке: Msg 111, Level 15, State 1, Line 3 ‘CREATE VIEW’ must be the first statement in a query batch. Для решения этой проблемы можно включить инструкцию if и create view в разные пакеты, добавив команду GO после инструкции if. IF OBJECT_ID('Sales.MyView', 'V') IS NOT NULL DROP VIEW Sales.MyView; GO -- первый пакет
CREATE VIEW Sales.MyView AS SELECT YEAR(orderdate) AS orderyear, COUNT(*) AS numorders FROM Sales.Orders GROUP BY YEAR(orderdate);
GO --второй пакет Пакет как единица разрешения имен Пакет — это блок разрешения имен, т. е. проверка наличия объектов и столбцов выполняется на уровне пакета. Об этом следует помнить, проектируя границы пакета. Когда вы применяете к объекту изменения схемы и пытаетесь в том же пакете манипулировать данными объекта, SQL Server может все еще не знать об изменениях схемы и аварийно завершить инструкцию обработки данных с ошибкой разрешения имен. Пример: создание в базе данных tempdb таблицы Т1, содержащей один столбец col1: USE tempdb; IF OBJECT_ID('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1; CREATE TABLE dbo.T1(col1 INT); GO --вставить в Т1 столбец со12 и запрос с новым столбцом в том же пакете ALTER TABLE dbo.T1 ADD col2 INT; SELECT col1, col2 FROM dbo.T1; GO Несмотря на то, что программный код может показаться совершенно корректным, пакет завершится аварийно на стадии разрешения имен с сообщением об ошибке: Msg 207, Level 16, State 1, Line 2 Invalid column name 'col2'
Читайте также: Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|