SUBSTRING (Transact-SQL)

Возвращает фрагмент символьного, двоичного, текстового или графического выражения. Дополнительные сведения о допустимых типах данных SQL Server 2005, которые могут быть использованы в этой функции, см. в разделе Типы данных (Transact-SQL).

Значок ссылки на разделСоглашения о синтаксисе в Transact-SQL

Синтаксис

SUBSTRING ( expression ,start , length )

Аргументы

  • expression
    Строка символов, двоичная строка, текст, изображение, столбец или выражение expression, включающее столбец. Не следует использовать выражения, включающие статистические функции.
  • start
    Целое число, определяющее позицию начала подстроки. Аргумент start может иметь тип bigint.
  • length
    Положительное целое число, которое указывает, сколько символов или байтов выражения expression будет возвращено. Если значение аргумента length отрицательно, то возвращается ошибка. Аргумент length может иметь тип bigint.

    ms187748.note(ru-ru,SQL.90).gifПримечание.
    Поскольку аргументы start и length указывают число байтов, при использовании функции SUBSTRING с типом данных text в двухбайтовых параметрах сортировки, таких как kanji, коды символов в начале или конце результата могут оказаться разбитыми на части. Такое поведение согласуется с тем, как обрабатывает двухбайтовые коды функция READTEXT. В связи с этим рекомендуется использовать для двухбайтовых символов тип данных ntext, а не text. Другой рекомендуемой альтернативой является использование типа данных varchar(max), так как он не приводит к разбиению кодов на части в двухбайтовых параметрах сортировки.

Типы возвращаемых данных

Возвращает символьные данные, если аргумент expression является одним из поддерживаемых типов символьных данных. Возвращает двоичные данные, если expression является одним из поддерживаемых типов двоичных данных binary.

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

Заданное выражение Возвращаемый тип

char/varchar/text

varchar

nchar/nvarchar/ntext

nvarchar

binary/varbinary/image

varbinary

Замечания

Смещения (start и length), которые используются при работе с типами данных ntext, char или varchar, должны быть заданы числом символов. Смещения, которые используются при работе с типами данных text, image, binary или varbinary, должны быть заданы числом байтов.

ms187748.note(ru-ru,SQL.90).gifПримечание.
Уровни совместимости могут влиять на возвращаемые значения. Дополнительные сведения об уровнях совместимости см. в разделе sp_dbcmptlevel (Transact-SQL).

Примеры

А. Использование SUBSTRING с символьной строкой

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

USE AdventureWorks;
GO
SELECT LastName, SUBSTRING(FirstName, 1, 1) AS Initial
FROM Person.Contact
WHERE LastName like 'Barl%'
ORDER BY LastName

Ниже приводится результирующий набор.

LastName   Initial
---------------------------------        -------
Barley     R
Barlow     B

(2 row(s) affected)

Далее показано, как можно вывести второй, третий и четвертый символ строковой константы abcdef.

SELECT x = SUBSTRING('abcdef', 2, 3)

Ниже приводится результирующий набор.

x
----------
bcd

(1 row(s) affected)

Б. Использование SUBSTRING с данными типа text, ntext или с изображением

ms187748.note(ru-ru,SQL.90).gifПримечание.
Для выполнения следующих примеров необходимо установить базу данных pubs. Дополнительные сведения об установке базы данных pubs см. в разделе Загрузка образцов баз данных Northwind и pubs.

Следующий пример демонстрирует получение первых 200 символов из столбцов text и image таблицы pub_info базы данных pubs. Данные text возвращаются как varchar, а данные image возвращаются как varbinary.

USE pubs
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo, 
   SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756'

Ниже приводится результирующий набор.

pub_id logo    pr_info    
------ ---------------------- ---------- 
1756   0x474946383961E3002500 This is sa

(1 row(s) affected)

Следующий пример показывает влияние SUBSTRING на оба типа данных, text и ntext. Во-первых, пример создает новую таблицу в базе данных pubs под именем npub_info. Во-вторых, пример создает столбец pr_info в таблице npub_info из первых 80 символов столбца pub_info.pr_info и добавляет u в качестве первого символа. Наконец, соединение INNER JOIN возвращает все идентификационные номера издателей и выполняет функцию SUBSTRING над столбцами сведений об издателях, имеющих тип данных text и ntext.

IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES 
      WHERE table_name = 'npub_info')
   DROP TABLE npub_info
GO
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs
GO
CREATE TABLE npub_info
(
 pub_id         char(4)           NOT NULL
         REFERENCES publishers(pub_id)
         CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
 pr_info        ntext             NULL
)

GO

-- Fill the pr_info column in npub_info with international data.
RAISERROR('Now at the inserts to pub_info...',0,1)

GO

INSERT npub_info VALUES('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs database')
INSERT npub_info values('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa')
INSERT npub_info values('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da')
INSERT npub_info values('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database')
INSERT npub_info values('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d')
INSERT npub_info values('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab')
INSERT npub_info values('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i')
INSERT npub_info values('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data')
GO
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
   SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info pr INNER JOIN npub_info npr
   ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC

См. также

Справочник

Строковые функции (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005