ALTER DATABASE database_name [ON [DEFAULT | database_device][=size] [,database_device[=size]]...] [FOR LOAD]Позволят производить различные операции с базой данных после ее создания
ALTER DATABASE testing ON DEVICE1 = 8
ALTER TABLE [database.[owner].]table_name [WITH NOCHECK] [ADD {col_name column_properties column_constraints] |[[,]table_constraint]} [,{next_col_name|next_table_constraint}]...] | DROP [CONSTRAINT] constraint_name[,constraint_name]Позволят производить различные операции с таблицей после ее создания
ALTER TABLE authors ADD CONSTRAINT UPKCL_auidind PRIMARY KEY CLUSTERED (au_id)
ALTER TABLE titles ADD CONSTRAINT FK_pub_id FOREIGN KEY (pub_id) REFERENCES publishers(pub_id)
ALTER TABLE titles ADD CONSTRAINT UNC_name_city UNIQUE NONCLUSTERED (stor_name,city)
ALTER TABLE authors ADD DEFAULT 'UNKNOWN' FOR phoneБудьте внимательны с default!
ALTER TABLE authors ADD CONSTRAINT CK_zip CHECK (zip LIKE '[0-9][0-9][0-9][0-9][0-9]')
ALTER TABLE publishers ADD country varchar(30) NULL DEFAULT('USA')
Пример
SELECT COUNT(*) FROM titles SELECT COUNT(*) FROM authors
CASE expression WHEN expression1 THEN exression1 [[WHEN expression2 THEN expression2[..]] [ELSE expressionN] ENDCASE Expression с поиском
CASE WHEN Boolean_expression1 THEN expression1 [[WHEN Boolean_expression2 THEN expression2[..]] [ELSE expressionN] ENDФункции, полезные для CASEобразия:
COALESCE(expression1,expression2,...) NULLIF(expression1,expression2) ISNULL(expression1, expression)COALESCE возвращает первое не-NULL выражение из списка, NULLIF возвращает NULL, если два выражения равны, ISNULL возвращает expression2 в том случае, если expression1 'is null'
Примеры
SELECT Category= CASE type WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Modern Cooking' WHEN 'business' THEN 'Businness' WHEN 'psyhology' THEN 'Psyhology' WHEN 'trad_cook' THEN 'Traditional Cooking' ELSE 'Not yet categorized' END, 'Shortended Tiitle' = CONVERT(varchar(30), title), Price = price FROM titles WHERE price IS NOT NULL ORDER BY type COMPUTE AVG(price) BY TYPE go Category Shortedned Title Price ---------------------- ------------------------------ ----------- Business Cooking with Computers: Surrep 11.95 Business Straight Talkk About Computers 19.99 Business The Busy Executive's Database 19.99 Business You Can Combat Computer Stress 2.99 avg ============ 13.73
CHECKPOINTЗаписывает на диск все страницы, измененные с момента последнего выполнения оператора CHECKPOINT. Контрольные точки(Checkpoints), производимые оператором CHECKPOINT, являются дополнительными к тем контрольным точкам, которые берет сервер, исходя из заданного параметра recovery time
/*Текст комментария*/или
--Текст комментария
Оператор | Описание | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
BEGIN...END | Определяет блок. BEGIN {sql_statement|statement_block} END | ||||||||||||||||||||||||||||||||
GOTO label | Безусловный переход к метке label Метки описываются незамысловато: :label GOTO label | ||||||||||||||||||||||||||||||||
IF...ELSE | Условный оператор. Тоже ничего неожиданного IF Boolean_expression {sql_statement|statement_block} [ELSE [Boolean_expression] {sql_statement|statement_block} | ||||||||||||||||||||||||||||||||
RETURN | Безусловный выход. Синтаксис бесхитростен: RETURN ([integer_expression])Жалко только, что возвращаемое значение - это не значение функции, а некий код возврата, причем часть значений зарезервирована под специальные состояния (0 - все нормально):
| ||||||||||||||||||||||||||||||||
WAITFOR | Ожидание определенного события. WINTFOR {DELAY 'time'|TIME 'time'}DELAY - определение задержки time, ну а TIME - ожидание до указанного времени. time задается аналогично значениям для datetime | ||||||||||||||||||||||||||||||||
WHILE | Цикл с предусловием. WHILE Boolean_condition {sql_statement|statement_block} [BREAK] {sql_statement|statement_block} [CONTINUE] | ||||||||||||||||||||||||||||||||
...BREAK | Выход из цикла WHILE | ||||||||||||||||||||||||||||||||
...CONTINUE | Продолжение цикла WHILE |
Возможность | Описание |
---|---|
CASE | Позволяет выражениям принмать значение в зависимости от условий. Между прочим, CASE является стандартной возможностью ANSI SQL-92 |
Комментарии | Очень даже полезно хотя бы изредка комментировать свой код. Для комметатриев
можно использовать две формы - первая, аналогичная комментариям в С: /*некий глубокомысленный комметарий*/, и вторая, аналогичная комментариям в Аде: --Еще один заумный комметарий |
Оператор DECLARE | Повзоляет объявлять локальные переменные К слову сказать, он может стоять не только в начале процедуры или batch'а, но и где угодно в их теле. Удобно объявлять переменные там, где они используются, а не тремястами строками выше. Впрочем, на мой взгляд, злоупотреблять этим тоже не стоит... |
Оператор PRINT | Выдает заданное значение на экран. |
Оператор RAISERROR | Устанавливает ошибочное состояние |
DECLARE @Name varchar(40) DECLARE CT CURSOR FOR SELECT Name from Peoples OPEN CT WHILE 1=1 BEGIN FETCH FROM CT INTO @Name /*Так, на мой взгляд, удобнее обходиться с курсорами*/ IF @@fetch_status=-1 BREAK IF @@fetch_status=-2 CONTINUE PRINT @Name END DEALLOCATE CT
CREATE DATABASE database_name [ON [DEFAULT|database_device][= size] [,database_device][= size]]...] [LOG ON database_device[= size] [,database_device[= size]...] [FOR LOAD]Создает БД и, возможно, журнал транзакций на указанных devices, size - размер в мегабайтах. При создании новой базы данных используется как образец БД model.
CREATE DATABASE sales ON DEVICE3 = 125 LOG ON DEVICE4 = 60
CREATE DEFAULT [owner.]default_name AS constant_expressionСоздает объект, который впоследствии можно будет прикрепить к некоторой колонке или пользовательскому типу данных, причем при добавлении новых данных значение constant_expression будет использовано по умолчанию, т.е. тогда, когда не было указано значение для этой колонки или было использовано ключевое слово DFAULT или DEFAULT VALUES. Для привязки созданного DEFAULT следует пользоваться процедурой sp_bindefault
Следующая таблица показывает соотношение между определением колонки и добавляемым значением:
Определение колонки | Нет данных, нет DEFAULT | Нет данных, DEFAULT определен | Вводится NULL, нет DEFAULT | Вводится NULL, DEFAULT определен |
NULL | NULL | DEFAULT | NULL | NULL |
NOT NULL | error | default | error | error |
CREATE DEFAULT phonedflt AS 'unknown' sp_bindefault phonedflt,'authors.phone'
CREATE [UNIQUE][CLUSTERED|NONCLUSTERED]INDEX index_name ON [[database.]owner.]table_name(column_name[,column_name]...) [WITH] [FILLFACTOR = x] [[,] IGNORE_DUP_KEY] [[,] {SORTED_DATA | SORTED_DATA_REORG}] [[,] {IGNORE_DUP_ROW | ALLOW_DUP_ROW}]] [ON segment_name]Создает индекс для перечмсленных колонок на указанном сегоменте.
CLUSTERED - создавать кластеризованный индекс, т.е. такой индекс, при котором в листьях B-дерева, образующего индекс, находятся не ссылки на данные, а собственно страницы данных.
FILLFACTOR - позволяет управлять заполнением страниц B-дерева индекса, задается в процентах, 100% - полное заполнение.
Пример
CREATE UNIQUE CLUSTERED INDEX au_id_ind ON authors (au_id)
! |
Обратите внимание: если уже существующий пользовательский тип данных конфликтует с другим пользовательским или системным типом данных, то он будет использоваться как базовый системный тип. |
Вид данных | Системное представление |
---|---|
Двоичные | binary[(n)] varbinary[(n)] |
Символьные | char[(n)] varchar[(n)] |
Дата и время | datetime smalldatetime |
Точное представление чисел | decimal[(p[, s])] numeric[(p[, s])] |
Представление чисел с плавающей точкой | float[(n)] real |
Целочисленные типы | int - 4 байта smallint - 2 байта tinyint -1 байт |
Денежные типы | money smallmoney |
Специальные | bit timestamp типы, определяемые пользователем |
Текст и картинки | text image |
Синонимы | binary varying для varbinary character для char character для char (1) character (n) для char (n) character varying (n) для varchar (n) dec для decimal integer для int double precision для float float [(n)] для n = 1-7 для real float [(n)] для n = 8-15 для float |
При вводе данных используйте один из нескольких форматов, заключая значение в одиночные кавычки - " ' ". Если требуется получить секунды или миллисекунды - для этого применяется функция CONVERT. Существуют следующие типы даты и времени:
Apr[il] [15][,] 1996 Apr[il] 15[,] [19]96 Apr[il] 1996 [15] Apr[il] [19]96 15 [15] Apr[il][,] 1996 15 Apr[il][,][19]96 15 [19]96 apr[il] [15] 1996 apr[il] 1996 APR[IL] [15] [19]96 APR[IL] 15 1996 [15] APR[IL] [0]4/15/[19]96 (mdy) [0]4-15-[19]96 (mdy) [0]4.15.[19]96 (mdy) [04]/[19]96/15 (myd) 15/[0]4/[19]96 (dmy) 15/[19]96/[0]4 (dym) [19]96/15/[0]4 (ydm) [19]96/[04]/15 (ymd)но, наверное, самым удобным и безопасным является формат [19]960415 - строка из шести или восьми цифр, в формате ггггммдд или ггммдд. Строка из четырех цифр будет интерпретирована как год.
Первый - bit - предназначен для представления целых чисел в диапазоне от 0 до 1, причем при вводе числа, отличного от 1, принимается значение, равное 1. Тип данных bit имеет размер в один байт, но при наличии нескольких полей типа bit в таблице они все будут упакованы вместе, например, если у нас есть 7 полей типа bit, то суммарное занимаемое ими пространство будет равно одному байту.
! |
Обратите внимание: Для полей, имеющих тип bit, невозможно построить индекс. |
! |
Обратите внимание: Поля типа timestamp не имеют никакого отношения к системной дате или системному времени. |
timestamp имеет размер 8 байт и представлено как varbinary(8)
DBCC { CHECKALLOC [(database_name [, NOINDEX])] | CHECKCATALOG [(database_name)] | CHECKTABLE (table_name [, NOINDEX | index_id]) | CHECKDB [(database_name [, NOINDEX])] | CHECKIDENT [(table_name)] | DBREPAIR (database_name, DROPDB [, NOINIT]) | dllname (FREE) | INPUTBUFFER (spid) | MEMUSAGE | NEWALLOC [(database_name [, NOINDEX])] | OPENTRAN ({database_name} | {database_id}) [WITH TABLERESULTS] | OUTPUTBUFFER (spid) | PERFMON | PINTABLE (database_id, table_id) | SHOW_STATISTICS (table_name, index_name) | SHOWCONTIG (table_id, [index_id]) | SHRINKDB (database_name [, new_size [, 'MASTEROVERRIDE']]) | SQLPERF ({IOSTATS | LRUSTATS | NETSTATS | RASTATS [, CLEAR]} | {THREADS} | {LOGSPACE}) | TEXTALL [({database_name | database_id}[, FULL | FAST])] | TEXTALLOC [({table_name | table_id}[, FULL | FAST])] | TRACEOFF (trace#) | TRACEON (trace#) | TRACESTATUS (trace# [, trace#...]) | UNPINTABLE (database_id, table_id) | UPDATEUSAGE ({0 | database_name} [, table_name [, index_id]]) | USEROPTIONS} [WITH NO_INFOMSGS]где
! |
Обратите внимание: CHECKALLOC или NEWALLOC могут сообщать об ошибке в том случае, если база данных испольщуется кем-то еще, так что старайтесь запускать проверку при минимальной загрузке или даже в однопользовательском режиме. |
DBCC CHECKALLOC(pubs) go Checking pubs Alloc page 0 (# of extent=32 used pages=58 ref pages=58) Alloc page 256 (# of extent=26 used pages=37 ref pages=37) Alloc page 512 (# of extent=14 used pages=40 ref pages=40) Alloc page 768 (# of extent=1 used pages=8 ref pages=2) Alloc page 1024 (# of extent=1 used pages=0 ref pages=0) Alloc page 1280 (# of extent=1 used pages=0 ref pages=0) Total (# of extent=75 used pages=143 ref pages=137) in this database DBCC execution completed. If DBCC printed error messages, see your System Administrator.
CREATE PROCedure [owner.]procedure_name[;number] [(parameter1 [, parameter2]...[parameter255])] [{FOR REPLICATION} | {WITH RECOMPILE} [{[WITH] | [,]} ENCRYPTION]] AS sql_statements parameter= @parameter_name datatype[=default][OUTPUT]Создает процедуру с указанным именем. Процедура может быть создана только в текущей базе данных, за исключением временных процедур, которые создаются в tempdb. Для создания временных процедур следует начинать ее имя с '#' или '##'. Длина имени хранимой процедуры вместе с ## не может превышать 20 символов. Одна процедура может вызывать другую процедуру, уровень вложенности не может превышать 16, текущий уровень вложенности можно узнать из глобоальной переменной @@NESTLEVEL
Пользователь может создавать свои системные процедуры; они начинаются с символов sp_. При попытке выполнения такой процедуры она сначала ищется в текущей базе данных, в случае же неудачи - в базе данных master. Таблицы, используемые в системной процедуре, определямой пользователем, также сначала отыскиваются в текущей базе данных, и если это не удалось - в базе данных master.
CREATE PROCEDURE au_info_all AS SELECT au_lname, au_fname, title, pub_name FROM authors a, titles t, publishers p, titleauthor ta WHERE a.au_id = ta.au_id AND t.title_id = ta.title_id AND t.pub_id = p.pub_id
CREATE RULE [owner.]rule_name AS condition_expressionСоздает правило - некоторый объект, который впоследствие может быть привязан к какой-либо колонке или типу, определяемому пользователем.
Вы можете привязать правило к колонке, к которой до этого уже было привязано какое-либо другое правило; после этого уже будет использоваться вновь привязанное правило. Более того, привязка правила имеет больший приоритет, чем тип данных, определяемый пользователем.
CREATE RULE list_rule AS @list IN ('1389', '0736', '0877')
CREATE TABLE [database.[owner].]table_name ( {col_name column_properties [constraint [constraint [...constraint]]] | [[,] constraint]} [[,] {next_col_name | next_constraint}...] ) [ON segment_name]Создает таблицу
column_properties = datatype [NULL | NOT NULL | IDENTITY[(seed, increment)]]
! |
Обратите внимание: Сервер не гарантирует непрерывность или
уникальность значений - в реальных данных, лежащих в таблице могут появляться
разрывы. Для избежания ошибок с уникальностью используйте ограничение
|
PRIMARY KEY: [CONSTRAINT constraint_name] PRIMARY KEY [CLUSTERED | NONCLUSTERED] (col_name [, col_name2 [..., col_name16]]) [ON segment_name] UNIQUE: [CONSTRAINT constraint_name] UNIQUE [CLUSTERED | NONCLUSTERED] (col_name [, col_name2 [..., col_name16]]) [ON segment_name] FOREIGN KEY: [CONSTRAINT constraint_name] [FOREIGN KEY (col_name [, col_name2 [..., col_name16]])] REFERENCES [owner.]ref_table [(ref_col [, ref_col2 [..., ref_col16]])] DEFAULT: [CONSTRAINT constraint_name] DEFAULT {constant_expression | niladic-function | NULL} [FOR col_name] CHECK: [CONSTRAINT constraint_name] CHECK [NOT FOR REPLICATION] (expression)
! |
Обратите внимание: Все колонки, входящие в первичный ключ не могут быть объявлены как NULL. Если же этот параметр при созданни был опущен - для всех колонок принимается NOT NULL. |
По умолчанию созжается некластеризованный индекс.
! |
Обратите внимание: Ограничение FOREIGN KEY, в отличие от PRIMARY KEY, НЕ СОЗДАЕТ ИНДЕКСА. |
! |
Обратите внимание: Если в дальнейшем для этой таблицы будет создан CLUSTERED индекс без указания сегмента - все данные будут перенесены на DEFAULT сегмент. |
NB |
Обратите внимание: Вышеуказанным свойством можно пользоваться для перемещения таблицы по разным дискам и т.п. |
NB |
Обратите внимание: Дополнив запись до 1962 байта можно получить строчную блокировку. |
CREATE TABLE employee ( emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'), /* Each employee ID consists of three characters that represent the employee's initials, followed by a five digit number ranging from 10000 to 99999 and then the employee's gender (M or F). A - (hyphen) is acceptable for the middle initial. */ fname varchar(20) NOT NULL, minit char(1) NULL, lname varchar(30) NOT NULL, job_id smallint NOT NULL DEFAULT 1 /* Entry job_id for new hires. */ REFERENCES jobs(job_id), job_lvl tinyint DEFAULT 10, /* Entry job_lvl for new hires. */ pub_id char(4) NOT NULL DEFAULT ('9952') REFERENCES publishers(pub_id), /* By default the Parent Company Publisher is the company to whom each employee reports. */ hire_date datetime NOT NULL DEFAULT (getdate()) /* By default the current system date will be entered. */ )
CREATE TRIGGER [owner.]trigger_name ON [owner.]table_name FOR {INSERT, UPDATE, DELETE} [WITH ENCRYPTION] AS sql_statementsИли используя предложение IF UPDATE
CREATE TRIGGER [owner.]trigger_name ON [owner.]table_name FOR {INSERT, UPDATE} [WITH ENCRYPTION] AS IF UPDATE (column_name) [{AND | OR} UPDATE (column_name)...] sql_statementsЭтот оператор создает триггер - специальную разновидность хранимой процедуры, которая выполняется в тех случаях, когда пользователь пытается добавить, удалить или модифицировать данные. Триггеры часто используются для реализации бизнес-логики и проверки целостности данных.
! |
Обратите внимание: Триггер срабатывает один раз на всю
операцию вставки, модификации или удаления данных. Даже если операция реально не
затрагивает ни одной записи, как, например, в случае DELETE FROM PAYS WHERE 1=2 триггер все равно сработает, @@ROWCOUNT будет равен нулю, а таблица DELETED пуста |
CREATE TRIGGER employee_insupd ON employee FOR INSERT, UPDATE AS /* Get the range of level for this job type from the jobs table. */ DECLARE @min_lvl tinyint, @max_lvl tinyint, @emp_lvl tinyint, @job_id smallint SELECT @min_lvl = min_lvl, @max_lvl = max_lvl, @emp_lvl = i.job_lvl, @job_id = i.job_id FROM employee e, jobs j, inserted i WHERE e.emp_id = i.emp_id AND i.job_id = j.job_id IF (@job_id = 1) and (@emp_lvl <> 10) BEGIN RAISERROR ('Job id 1 expects the default level of 10.',16,-1) ROLLBACK TRANSACTION END ELSE IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl) BEGIN RAISERROR ('The level for job_id:%d should be between %d and %d.', 16, -1, @job_id, @min_lvl, @max_lvl) ROLLBACK TRANSACTION END
CREATE VIEW [owner.]view_name [(column_name [, column_name]...)] [WITH ENCRYPTION] AS select_statement [WITH CHECK OPTION]Создает виртуальную таблицу(представление), воспроизводящую данные из одной или более реальных таблиц. Для создания VIEW невозможно использовать оператор UNION, не разрешаются операции вставки в представление, если во VIEW существуют вычислимые поля.
CREATE VIEW titles_view AS SELECT title, type, price, pubdate FROM titles
Оператор | Описание |
---|---|
DECLARE CURSOR | Создает курсор |
OPEN | Открывает курсор |
FETCH | Выбирает данные |
CLOSE | Закрывает ранее открытый курсор |
DEALLOCATE | Уничтожает ранее созданый курсор |
UPDATE table_name SET column_name1 = {expression1 | NULL | (select_statement)} [, column_name2 = {expression2 | NULL | (select_statement)}...] WHERE CURRENT OF cursor_nameа для удаления - следующая:
DELETE FROM table_name WHERE CURRENT OF cursor_nameКурсор объявляется оператором DECLARE:
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR {READ ONLY | UPDATE [OF column_list]}]Оператор OPEN служит для открытия курсора. Он имеет следующий синтаксис: OPEN cursor_name После открытия курсора в переменной @@CURSOR_ROW может быть одно из следующих значений:
FETCH [[NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n] FROM] cursor_name [INTO @variable_name1, @variable_name2, ...]
Глобальная переменная @@FETCH_STATUS возвращает результат последнего fetch'а -
Оператор DEALLOCATE закрывает курсор и уничтожает все связанные с ним структуры данных.
DECLARE @Name varchar(40) DECLARE CT CURSOR FOR SELECT Name from Peoples OPEN CT WHILE 1=1 BEGIN FETCH FROM CT INTO @Name /*Так, на мой взгляд, удобнее обходиться с курсорами*/ IF @@fetch_status=-1 BREAK IF @@fetch_status=-2 CONTINUE PRINT @Name END DEALLOCATE CT
DECLARE @variable_name datatype [, @variable_name datatype...]Создает локальные переменные для batch'а или процедуры. Также служит для объявления курсоров.
DECLARE @I INT
DELETE [FROM] {table_name | view_name} [WHERE clause]Где clause -
В дополнение к стадартному синтаксису Transact-SQL имеет расширение:
DELETE [FROM] {table_name | view_name} [FROM {table_name | view_name} [, {table_name | view_name}]...] [..., {table_name16 | view_name16}]] [WHERE clause]что позволяет использовать при удалении более одной таблицы в WHERE
DELETE FROM titleauthor FROM authors a, titles t WHERE a.au_id = titleauthor.au_id AND titleauthor.title_id = t.title_id AND t.title LIKE '%computers%'
DISK INIT NAME = 'logical_name', PHYSNAME = 'physical_name', VDEVNO = virtual_device_number, SIZE = number_of_2K_blocks [, VSTART = virtual_address]Создает DEVICE с указанным логическим именем и соответствующий файлу с именем physical_name, размером в number_of_2K_blocks. VDEVNO - номер вирутального устройства, может быть любым в промежутке от 1 до 255. Номер 0 зарезервирован для
DISK INIT NAME = 'DEVICE2', PHYSNAME = 'd:\sqldata\device2.dat', VDEVNO = 2, SIZE = 8192
DISK REINIT NAME = 'logical name', PHYSNAME = 'physical_name', VDEVNO = 'virtual_device_number', SIZE = number_of_2K_blocks [,VSTART = virtual_address]Позволяет использовать ранее созданный DEVICE, если по тем или иным причинам о нем нет записи в master database. logical_name - его наименование, physical_name указывает, что это за файл, virtual_device_number - виртуальный номер (см. DISK INIT), number_of_2K_blocks - число двухкилобайтных блоков в нем, virtual_address - виртуальный начальный адрес, по умолчанию 0.
! |
При некорректном указании размера существовашего ранее DEVICE оно будет разрушено при попытке подключения. |
DISK REFITИспользуется после DISK REINIT для завершения процесса подключения ранее существовавшего DEVICE.
DROP DATABASE database_name [, database_name...]Уничтожает базу данных - то есть уничтожает все объекты, относящиеся к ней, освобождает распределенное для нее место на диске и уничтожает все ссылки на нее из master'а. Невозможно уничтожить базу данных, кем-либо используемую в данный момент.
DROP DATABASE pubs, newpubs
DROP DEFAULT [owner.]default_name [, [owner.]default_name...]Уничтожает DEFAULT. Перед тем, как уничтожить DEFAULT, его необходимо предварительно открепить с помощю хранимой процедуры sp_unbindefault от колонок, к которым он был ранее прикреплен. Если данные колонки допускали значение NULL, то оно будет в них вставлено, если же колонка не допускает NULL, вы получите сообщение об ошибке.
sp_unbindefault 'authors.phone' go DROP DEFAULT phonedflt
DROP INDEX [owner.]table_name.index_name [, [owner.]table_name.index_name...]Уничтожает указанный индекс.
DROP INDEX authors.au_id_ind
DROP PROCedure [owner.]procedure_name [, [owner.]procedure_name...]Уничтожает процедуру в текущей базе данных. Если процедура является пользовательской системнрй процедурой, т.е. начинается с символов sp_, то она ищется в базе данных master. Если процедура с указанным имененем не найдена в текущей базе данных - она опять-таки ищется в базе данных master.
Группа процедур (т.е. процедуры с одинаковым именем, но с разным параметром ;number могут быть удалены одним оператором DROP
DROP PROCEDURE byroyalty
DROP RULE [owner.]rule_name [, [owner.]rule_name...]Удаляет правило. Для того, чтобы правило можно было удалить, необходимо его предварительно открепить от колонки с помощью хранимой процедуры sp_unbindrule
sp_unbindrule 'publishers.pub_id' go DROP RULE pub_id_rule
DROP TABLE [[database.]owner.]table_name [, [[database.]owner.]table_name...]Уничтожает таблицу. Невозможно уничтожить таблицу, на которую ссылаются другие таблицы с помощью FOREIGN KEY, кроме того, невозможно уничтожить системную таблицу. Не следует путать операторы
DROP TABLE titles1
DROP TRIGGER [owner.]trigger_name [, [owner.]trigger_name...]Уничтожает указанный триггер
DROP TRIGGER employee_insupd
DROP VIEW [owner.]view_name [, [owner.]view_name...]Уничтожает указанный VIEW
DROP VIEW titles_view
DUMP DATABASE {dbname | @dbname_var} TO dump_device [, dump_device2 [..., dump_device32]] [WITH options [[,] STATS [ = percentage]]] Резеврное копирование журнала транзакций: DUMP TRANSACTION {dbname | @dbname_var} [TO dump_device [, dump_device2 [..., dump_device32]]] [WITH {TRUNCATE_ONLY | NO_LOG | NO_TRUNCATE} {options}]Создает резервную копию базы данных или журнала транзакций, которые впоследствие могут быть загружены оператором LOAD. При резервном копировании журнала транзакций автоматически удаляется его неактивная часть.
! |
Обратите внимание: Если после |
Если же у вас переполнился лог до такой степени, что и
TRUNCATE_ONLY не помогает - используйте опцию
* The next day. */ DUMP TRANSACTION corporate TO DISK = '\\servername\sharename\directory\filename.ext' WITH NO_LOG go
EXEC[ute] {[@return_status =] {[[[server.]database.]owner.]procedure_name[;number] | @procedure_name_var} [[@parameter_name =] {value | @variable [OUTPUT]] [, [@parameter_name =] {value | @variable [OUTPUT]}]...] [WITH RECOMPILE]] EXEC[ute] ({@str_var | 'tsql_string'} [{@str_var | 'tsql_string'}...)}Выполняет указанную хранимую процедуру с указанными параметрами, возвращая код возврата. Кроме процедур также можно ивыполнять и строку симоволов
constant | column_name | function | (subquery)} [{operator | AND | OR | NOT} {constant | column_name | function | (subquery)}...]Используются вместе с константами, переменными и именами колонок в большинстве операторов TSQL. Строковые константы представляются как имеющие тип varchar, все выражения, имеющие тип varchar при сравнении с выражениями типа char преобразуются в него же, т.е. к ним добавляются дополнительные пробелы
AVG | COUNT(*) | MIN |
COUNT | MAX | SUM |
DATEADD | DATENAME | GETDATE |
DATEDIFF | DATEPART |
ABS | DEGREES | RAND |
ACOS | EXP | ROUND |
ASIN | FLOOR | SIGN |
ATAN | LOG | SIN |
ATN2 | LOG10 | SQRT |
CEILING | PI | TAN |
COS | POWER | |
COT | RADIANS |
CURRENT_TIMESTAMP | SYSTEM_USER |
CURRENT_USER | USER |
SESSION_USER |
LTRIM | SOUNDEX | |
ASCII | PATINDEX | SPACE |
CHAR | REPLICATE | STR |
CHARINDEX | REVERSE | STUFF |
DIFFERENCE | RIGHT | SUBSTRING |
LOWER | RTRIM | UPPER |
COALESCE | HOST_NAME | OBJECT_NAME |
COL_LENGTH | IDENT_INCR | STATS_DATE |
COL_NAME | IDENT_SEED | SUSER_ID |
DATALENGTH | INDEX_COL | SUSER_NAME |
DB_ID | ISNULL | USER_ID |
DB_NAME | NULLIF | USER_NAME |
GETANSINULL | HOST_ID | OBJECT_ID |
Полномочия на выполнение операторов: GRANT {ALL | statement_list} TO {PUBLIC | name_list} Полномочия на объекты: GRANT {ALL | permission_list} ON {table_name [(column_list)] | view_name [(column_list)] | stored_procedure_name | extended_stored_procedure_name} TO {PUBLIC | name_list}Назначает полномочия пользователям.
По умолчанию полномочия даются системному администратору, владельцу базы данных, владельцу объекта или группе PUBLUC. Нектороые из них они могут передать другим пользователям. По умолчанию системный администратор имеет все полномочия, он может использовать хранимую процедуру sp_changedbowner для изменения владельца базы данных. Владелец базы данных или системный администратор могут передавать полномочия на сам оператор GRANT.
Пользователи могут входит только в одну группу, исключая группу PUBLIC.
Для измения прав кроме оператора GRANT существует оператор REVOKE, имеющий следующий синтаксис:
Полномочия на выполнение операторов: REVOKE {ALL | statement_list} FROM {PUBLIC | name_list} Полномочия на объекты: REVOKE {ALL | permission_list} ON {table_name [(column_list)] | view_name [(column_list)] | stored_procedure_name | extended_stored_procedure_name} FROM {PUBLIC | name_list
По умолчанию | Могут ли быть переданы/изъяты | ||||||
---|---|---|---|---|---|---|---|
Оператор | Системный администратор | Владелец БД | Владелец обьекта | Public | Да | Нет | Чушь! |
ALTER DATABASE | - | X | - | -1 | - | - | - |
ALTER TABLE | - | - | X | - | - | X | - |
BEGIN TRANSACTION | - | - | - | X | - | - | X |
CHECKPOINT | - | X | - | - | - | X | - |
COMMIT TRANSACTION | - | - | - | X | - | - | X |
CREATE DATABASE | X | - | - | - | X | - | - |
CREATE DEFAULT | - | X | - | - | X | - | - |
CREATE INDEX | - | - | X3 | - | - | X | - |
CREATE PROCEDURE | - | X | - | - | X | - | - |
CREATE RULE | - | X | - | - | X | - | - |
CREATE TABLE | - | X | -2 | X2 | - | - | - |
CREATE TRIGGER | - | - | X3 | - | - | X | - |
CREATE VIEW | - | X | - | - | X | - | - |
DBCC 4 | - | X | - | - | - | X | - |
DELETE | - | - | X | - | X | - | - |
DISK INIT | X | - | - | - | - | X | - |
DISK MIRROR | X | - | - | - | - | X | - |
DISK REFIT | X | - | - | - | - | X | - |
DISK REINIT | X | - | - | - | - | X | - |
DISK REMIRROR | X | - | - | - | - | X | - |
DISK UNMIRROR | X | - | - | - | - | X | - |
DROP any object | - | - | X | - | - | X | - |
DUMP DATABASE | - | X | - | - | X | - | - |
DUMP TRANSACTION | - | X | - | - | X | - | - |
EXECUTE 5 | - | - | X | - | X | - | - |
GRANT | - | X | - | - | - | X | - |
GRANT on object | - | - | X | - | - | X | - |
INSERT | - | - | X | - | X | - | - |
KILL | X | - | - | - | - | X | - |
LOAD DATABASE | - | X | - | - | - | X | - |
LOAD TRANSACTION | - | X | - | - | - | X | - |
- | - | - | X | - | - | X | |
RAISERROR | - | - | - | X | - | - | X |
READTEXT | - | - | X | -6 | - | - | - |
RECONFIGURE | X | - | - | - | - | X | - |
REFERENCES | - | - | X | - | X | - | - |
REVOKE | - | X | - | - | - | X | - |
REVOKE on object | - | - | X | - | - | X | - |
ROLLBACK TRANSACTION | - | - | - | X | - | - | X |
SAVE TRANSACTION | - | - | - | X | - | - | X |
SELECT | - | - | X | - | X | - | - |
SET | - | - | - | X | - | - | X |
SETUSER | - | X | - | - | - | X | - |
SHUTDOWN | X | - | - | - | - | X | - |
TRUNCATE TABLE | - | - | X | - | - | X | - |
UPDATE | - | - | X | - | X | - | - |
UPDATE STATISTICS | - | - | X | - | - | X | - |
UPDATETEXT | - | - | X | -7 | - | - | - |
WRITETEXT | - | - | X | -7 | - | - | - |
GRANT SELECT ON authors TO public go GRANT INSERT, UPDATE, DELETE ON authors TO Mary, John, Tom
Если вы указываете имя объекта не целиком, то сервер сначала пытается найти
его среди объектов, которыми владеете вы, после этого производится попытка найти
указанный объект как database.dbowner.name. Для определеня
видимости хранимых процедур, начинающихся с символов sp_ см.
раздел, посвященный оператору
INSERT [INTO] {table_name | view_name} [(column_list)] {DEFAULT VALUES | values_list | select_statement}Добавляет запись в таблицу.
INSERT titles VALUES('BU2222', 'Faster!', 'business', '1389', NULL, NULL, NULL, NULL, 'ok', '06/17/87') INSERT titles(title_id, title, type, pub_id, notes, pubdate) VALUES ('BU1237', 'Get Going!', 'business', '1389', 'great', '06/18/86') INSERT INTO newauthors SELECT * FROM authors WHERE city = 'San Francisco'
ADD | ALL | ALTER |
AND | ANY | AS |
ASC | AVG | BEGIN |
BETWEEN | BREAK | BROWSE |
BULK | BY | CASE |
CHECK | CHECKPOINT | CLOSE |
CLUSTERED | COALESCE | COMMIT |
COMMITTED | COMPUTE | CONFIRM |
CONSTRAINT | CONTINUE | CONTROLROW |
CONVERT | COUNT | CREATE |
CURRENT | CURRENT_DATE | CURRENT_TIME |
CURRENT_TIMESTAMP | CURRENT_USER | CURSOR |
DATABASE | DBCC | DEALLOCATE |
DECLARE | DEFAULT | DELETE |
DESC | DISK | DISTINCT |
DOUBLE | DROP | DUMMY |
DUMP | ELSE | END |
ERRLVL | ERROREXIT | EXCEPT |
EXEC | EXECUTE | EXISTS |
EXIT | FETCH | FILLFACTOR |
FLOPPY | FOR | FOREIGN |
FROM | GOTO | GRANT |
GROUP | HAVING | HOLDLOCK |
IDENTITY | IDENTITY_INSERT | IDENTITYCOL |
IF | IN | INDEX |
INSENSITIVE | INSERT | INTERSECT |
INTO | IS | ISOLATION |
KEY | KILL | LEVEL |
LIKE | LINENO | LOAD |
MAX | MIN | MIRROREXIT |
NOCHECK | NONCLUSTERED | NOT |
NULL | NULLIF | OF |
OFF | OFFSETS | ON |
ONCE | ONLY | OPEN |
OPTION | OR | ORDER |
OVER | PERM | PERMANENT |
PIPE | PLAN | PRECISION |
PREPARE | PRIMARY | |
PROC | PROCEDURE | PROCESSEXIT |
PUBLIC | RAISERROR | READ |
RECONFIGURE | REFERENCES | REPEATABLE |
REPLICATION | RETURN | REVOKE |
ROLLBACK | ROWCOUNT | RULE |
SAVE | SCROLL | SELECT |
SERIALIZABLE | SESSION_USER | SET |
SETUSER | SHUTDOWN | SOME |
STATISTICS | SUM | SYSTEM_USER |
TABLE | TAPE | TEMP |
TEMPORARY | TEXTSIZE | THEN |
TO | TRAN | TRANSACTION |
TRIGGER | TRUNCATE | TSEQUAL |
UNCOMMITTED | UNION | UNIQUE |
UPDATE | UPDATETEXT | USE |
USER | VALUES | VARYING |
VIEW | WAITFOR | WHEN |
WHERE | WHILE | WITH |
WRITETEXT |
KILL spidУничтожает процесс с заданным spid. Для просмотра списка процессов и их spid используйте хранимую процедуру sp_who.
Пример
KILL 15
Загрузка базы данных: LOAD DATABASE {dbname | @dbname_var} FROM dump_device [, dump_device2 [..., dump_device32]] [WITH options [[,] STATS [ = percentage]]] Загрузка журнала транзакций: LOAD TRANSACTION {dbname | @dbname_var} FROM dump_device [, dump_device2 [..., dump_device32]] [WITH options] Загрузка информации о резервной копии: LOAD HEADERONLY FROM dump_deviceОператор LOAD служит для загрузки ранее сделанной с помощью оператора DUMP резервной копии базы данных (
Кроме восстановления после какого-либо сбоя и прочего несчаcтья (пожар,
падение Тунгусского метеорита) можно также использовать
! |
Обратите внимание: оба сервера должны иметь одинковую
кодовую страницу и порядок сортировки (sort order). Также необходимо, чтобы
размер базы данных на том сервере, нак котором производится загрузка данных был
не меньше, чем на исходном. Необходимо также следить за соблюдением количества и
порядка фрагменов DEVICES, например, если исходная база данных имела 10 мегабайт
данных, за которыми следовало 6 мегабайт журнала транзакций, за которыми
следовало еще 10 мегабайт данных, то и принимающая база данных должна иметь те
же особенности. Если при создании исходной базы данных использовались сегменты, то и у базы данных, в которую производится загрузка, должны быть те же сегменты и DEVICE's должны иметь тот же размер. |
Для подробного описания фрагментов DEVICES и работы с ними см.
Для более подробного описания процедур резервного копирования см. соответсвующий раздел в Database Administration Companion.
Пример
LOAD DATABASE corporate FROM tape_dev1 LOAD DATABASE corporate FROM TAPE = '\\.\tape0'
Следует обратить внимание на то, что если вы создаете таблицу с колонками, допускающими NULL, то значение будут внутрисерверно преобразовываться в соответствии со следующей таблицей:
Тип данных | Преобразуется в |
---|---|
binary | varbinary |
char | varchar |
datetime | datetim |
decimal | decimal |
float | float |
int | int |
money | money |
numeric | numeric |
real | float |
smalldatetime | datetim |
smallint | int |
smallmoney | money |
tinyint | int |
Сложение | + |
Вычитание | - |
Умножение | * |
Деление | / |
Побитное И | & |
Побитное ИЛИ | | |
Побоитное НЕ | ~ |
Исключающее ИЛИ | ^ |
Равно | = |
Больше | > |
Меньше | < |
Больше или равно | >= |
Меньше или равно | <= |
Неравно | <> или != (нестандартно!) |
Не больше | !> |
Не меньше | !< |
LEFT OUTER JOIN | *= |
RIGHT OUTER JOIN | =* |
Конкатенация строк | + |
PRINT {'any ASCII text' | @local_variable | @@global_variable}Возвращает сообщение, определяемое пользователем, пользовательскому обработчику сообщений. Длина строки с сообщением не должна превышать 255 символов. Глобальной переменной в настоящее время можеть быть только переменная @@VERSION, так как только она является глобальной и одновременно символьной переменной.
Пример
IF EXISTS (SELECT zip FROM authors WHERE zip = '94705') PRINT 'Berkeley author'
RAISERROR ({msg_id | msg_str}, severity, state [, argument1 [, argument2]] ) [WITH LOG]Возвращает пользовательское сообщение об ошибке и устанавливает систменый флаг, указывающий на то, что произошла ошибка. severity определяет важность ошибки, которые можно посмотреть в System Administration Companion. Только системный администратор может использовать RAISERROR с severity от 19 до 25
Пример
REATE TRIGGER employee_insupd ON employee FOR INSERT, UPDATE AS /* Get the range of level for this job type from the jobs table. */ DECLARE @min_lvl tinyint, @max_lvl tinyint, @emp_lvl tinyint, @job_id smallint SELECT @min_lvl = min_lvl, @max_lvl = max_lvl, @emp_lvl = i.job_lvl, @job_id = i.job_id FROM employee e, jobs j, inserted i WHERE e.emp_id = i.emp_id AND i.job_id = j.job_id IF (@job_id = 1) and (@emp_lvl <> 10) BEGIN RAISERROR ('Job id 1 expects the default level of 10.',16,-1) ROLLBACK TRANSACTION END ELSE IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl) BEGIN RAISERROR ('The level for job_id:%d should be between %d and %d.', 16, -1, @job_id, @min_lvl, @max_lvl) ROLLBACK TRANSACTION END
Полномочия на выполнение операторов: REVOKE {ALL | statement_list} FROM {PUBLIC | name_list} Полномочия на объекты базы данных: REVOKE {ALL | permission_list} ON {table_name [(column_list)] | view_name [(column_list)] | stored_procedure_name | extended_stored_procedure_name} FROM {PUBLIC | name_list}Оператор REVOKE служит для отъятия различных прав у пользователей. При определении прав они сохраняются в системной таблице sysprotecs.
! |
Обратите внимание: полномочия, даваемые группе public, являются более значимые, чем полномочия, опрделенные ранее для некоторого пользователя или группы пользователей. Порядок выдачи полномочий имеет значение: только полномочия, выданные последними, имеют эффект. Таким образом, старайтесь сначала выдавать полномочия группе public, и далее по нисходящей |
Пример
REVOKE CREATE TABLE, CREATE DEFAULT FROM Mary, John
{WHERE | HAVING} [NOT] Boolean_expression {WHERE | HAVING} [NOT] Boolean_expression {AND | OR} Boolean_expression {WHERE | HAVING} [NOT] column_name IS [NOT] NULL {WHERE | HAVING} [NOT] column_name join_operator column_name {WHERE | HAVING} [NOT] column_name [NOT] LIKE 'match_string' {WHERE | HAVING} [NOT] EXISTS (subquery) {WHERE | HAVING} [NOT] expression comparison_operator expression {WHERE | HAVING} [NOT] expression [NOT] BETWEEN expression AND expression {WHERE | HAVING} [NOT] expression [NOT] IN (value_list | subquery) {WHERE | HAVING} [NOT] expression comparison_operator {ANY | ALL} (subquery) {WHERE CURRENT OF cursor_name}Определяет условия поиска, используемые для получения или модификации данных. Если вы используете более одного условия, соединяйте их логическими операторами AND и OR. При использовании LIKE с датами будьте внимательны: SQL Server преобразует даты к стандартному виду для дат, и поэтому дата 01.01.1997 будет представлена в виде Jan 1, 1997 12:00AM. Так что придется искать с % по обеим сторонам шаблона.
SELECT [ALL | DISTINCT] select_list [INTO [new_table_name]] [FROM {table_name | view_name}[(optimizer_hints)] [[, {table_name2 | view_name2}[(optimizer_hints)] [..., {table_name16 | view_name16}[(optimizer_hints)]]] [WHERE clause] [GROUP BY clause] [HAVING clause] [ORDER BY clause] [COMPUTE clause] [FOR BROWSE]Производит выборку данных из БД или присваивает значения переменным, причем выборка данных и присваивание значений не могут производиться одновременно. При установленной опции
! |
Впрочем, этой особенностью не стоит пользоваться - при больших выборках происходит смертельная блокировка таблиц tempdb..sysobjects, tempdb..sysindexes и tempdb..syscolumns,и, таким образом, всего tempdb, причем настолько здорово, что сервер приходится останавливать с помощью команды SHUTDOWN WITH NOWAIT. |
SET { {{{ANSI_NULL_DFLT_OFF | ANSI_NULL_DFLT_ON} | ARITHABORT | ARITHIGNORE | FMTONLY | FORCEPLAN | IDENTITY_INSERT [database.[owner.]]tablename | NOCOUNT | NOEXEC | OFFSETS {keyword_list} | PARSEONLY | PROCID | QUOTED_IDENTIFIER | SHOWPLAN | STATISTICS IO | STATISTICS TIME} {ON | OFF}} | DATEFIRST number | DATEFORMAT format | DEADLOCKPRIORITY {LOW | NORMAL} | LANGUAGE language | ROWCOUNT number | TEXTSIZE number | TRANSACTION ISOLATION LEVEL {READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE}}Позволяет изменить различные установки сервера.
SETUSER ['username' [WITH NORESET]]Представляет sa в текущей сессии как пользователя username. Если опущены все параметры, то sa вновь становится sa, если предварительно он использовал этот оператор как SETUSER username. При предварительном указании опции WITH NORESET такая возможность становится недоступной. Пример
SETUSER 'mary' go GRANT SELECT ON computer_types TO joe go SETUSER
SHUTDOWN [WITH NOWAIT]Завершает работу SQL Server. Если используется опция
SHUTDOWN
expression comparison_operator [ANY | ALL | SOME] (subquery)expression [NOT] IN (subquery)[NOT] EXISTS (subquery) (SELECT [ALL | DISTINCT] subquery_select_list [FROM {table_name | view_name}[optimizer_hints] [[, {table_name2 | view_name2}[optimizer_hints] [..., {table_name16 | view_name16}[optimizer_hints]]] [WHERE clause] [GROUP BY clause] [HAVING clause])Позапросы могут быть использованы помимо всего прочего и как выражения. Пример
declare @a varchar(80) select @a=(select first_name from employee ...)+ ' получает '+ (select convert(sum(pay)) from pays...)
TRUNCATE TABLE [[database.]owner.]table_nameУничтожает данные в таблице, но оставляет ее структуру и индексы нетронутыми, делает то же самое, что и
TRUNCATE TABLE authors
SELECT select_list [INTO clause] [FROM clause] [WHERE clause] [GROUP BY clause] [HAVING clause] [UNION [ALL] SELECT select_list [FROM clause] [WHERE clause] [GROUP BY clause] [HAVING clause]...] [ORDER BY clause] [COMPUTE clause]Объединяет результаты нескольких запросов в один. Имена колонок берутся из первого запроса. Колонки объединяются по порядку; они должны иметь одинаковый тип или приводится к одному типу. Пример
/* CORRECT */ SELECT cities = city FROM storeseast UNION SELECT city FROM stores ORDER BY cities
UPDATE {table_name | view_name} SET [{table_name | view_name}] {column_list | variable_list | variable_and_column_list} [, {column_list2 | variable_list2 | variable_and_column_list2} ... [, {column_listN | variable_listN | variable_and_column_listN}]] [WHERE clause]Этот оператор служит для обновления данных. Обратите внимание на то, что в если удается произвести т.н. update in-place, то производительность обновлений заметно возрастает. Это происходит при выполнении следующих условий:
UPDATE {table_name | view_name} SET [{table_name | view_name}] {column_list | variable_list | variable_and_column_list} [, {column_list2 | variable_list2 | variable_and_column_list2} ... [, {column_listN | variable_listN | variable_and_column_listN}]] [FROM {table_name | view_name} [, {table_name | view_name}]...] [..., {table_name16 | view_name16}]] [WHERE clause]что позволяет несколько более изящно проделывать различные операции.
Ранее было невозможно одновременно получить старое значение колонки и присвоить ему новое, для этого приходилось использовать что-то вроде
BEGIN TRANSACTION SELECT variable_name = column_name1 FROM table_name WHERE column_name2 = expression HOLDLOCK UPDATE table_name SET column_name1 = expression WHERE column_name2 = expression COMMIT TRANSACTIONтеперь же можно поступать следующим образом:
UPDATE table_name SET column_name1 = expression, variable_name = column_name1 WHERE column_name2 = expressionПример
UPDATE titles SET ytd_sales = (select sum(qty) FROM sales WHERE sales.title_id = titles.title_id AND sales.date IN (SELECT MAX(date) FROM sales)) FROM titles, sales
UPDATE STATISTICS [[database.]owner.]table_name [index_name]Обновляет статистические данные о распределении ключей в индексе. Эти данные используются оптимизатором для поиска наиболее выгодного плана, поэтому весьма важно не забывать периодически обновлять статистику; впрочем, для автоматического обновления можно воспользоваться SQL Executive, а в Transact-SQL Reference приведен пример полезной хранимой процедуры, обновляющей статистические данные для всех пользовательских таблиц. Эти данные автоматически обновляются при перестроении индекса. Утилита SQLMAINT.EXE предоставляет интерфейс командной строки для того же.
USE database_nameИзменяет текущую для данной сессии базу данных.
Пример
USE pubs
|
Программирование для чайников.
|