Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пакеты и переменные




Переменные локальны по отношению к пакету, в котором определены. Если сослаться на переменную, определенную в другом пакете, то получите ошибку, сообщающую о том, что переменная не определена.

Например, в следующем программном коде в одном пакете переменная объявлена и выведена на печать, а другом пакете делается попытка напечатать эту переменную.

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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...