Тип данных image в sql server

ОБЛАСТЬ ПРИМЕНЕНИЯ: SQL Server База данных SQL Azure Azure Synapse Analytics (хранилище данных SQL) Parallel Data Warehouse APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL DW) Parallel Data Warehouse

Эти типы данных фиксированной и переменной длины предназначены для хранения символьных и двоичных данных в формате Юникод и иных форматах. Fixed and variable-length data types for storing large non-Unicode and Unicode character and binary data. Данные в формате Юникод представляются символами кодировки UNICODE UCS-2. Unicode data uses the UNICODE UCS-2 character set.

ВАЖНО! IMPORTANT! Типы данных ntext, text и image будут исключены в следующей версии SQL Server. ntext, text, and image data types will be removed in a future version of SQL Server. Следует избегать использования этих типов данных при новой разработке и запланировать изменение приложений, использующих их в настоящий момент. Avoid using these data types in new development work, and plan to modify applications that currently use them. Вместо них следует использовать типы данных nvarchar(max), varchar(max)и varbinary(max) . Use nvarchar(max), varchar(max), and varbinary(max) instead.

Аргументы Arguments

ntext ntext
Данные переменной длины в кодировке Юникод с максимальной длиной строки 2^30 – 1 (1 073 741 823) байт. Variable-length Unicode data with a maximum string length of 2^30 – 1 (1,073,741,823) bytes. Размер памяти в байтах вдвое превышает длину введенной строки. Storage size, in bytes, is two times the string length that is entered. Синонимом ntext по стандарту ISO является national text. The ISO synonym for ntext is national text.

text text
Данные переменной длины не в Юникоде в кодовой странице сервера и с максимальной длиной строки 2^31-1 (2 147 483 647). Variable-length non-Unicode data in the code page of the server and with a maximum string length of 2^31-1 (2,147,483,647). Если в кодовой странице сервера используются двухбайтовые символы, объем занимаемого типом пространства все равно не превышает 2 147 483 647 байт. When the server code page uses double-byte characters, the storage is still 2,147,483,647 bytes. Он может быть менее 2 147 483 647 байт — в зависимости от строки символов. Depending on the character string, the storage size may be less than 2,147,483,647 bytes.

Читайте также:  Соц сети список популярных в россии

image image
Этот тип представляет двоичные данные переменной длины, включающие от 0 до 2^31 – 1 (2 147 483 647) байт. Variable-length binary data from 0 through 2^31-1 (2,147,483,647) bytes.

Remarks Remarks

Для работы с данными ntext, text или image можно использовать перечисленные ниже функции и инструкции. The following functions and statements can be used with ntext, text, or image data.

Инструкция по устранению ошибки при работе с SQL запросом – "The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator", если в запросе присутствует сортировка (ORDER BY) или группировка (GROUP BY):

Пример сообщения об ошибке:

Server: Msg 306, Level 16, State 1, Line 1
The text, ntext, and image data types cannot be compared
or sorted, except when using IS NULL or LIKE operator.

Тип данных NTEXT используется для данных в кодировке Unicode произвольной длины, тип данных TEXT используется для данных в остальных кодировках произвольной длины, тип данных IMAGE используется для бинарных данных произвольной длины.

Один из путей получить эту ошибку – это включить колонку типа TEXT, NTEXT или IMAGE в сортировку (ORDER BY). Для иллюстрации приведу скрипт, генерирующий эту ошибку:

CREATE TABLE [dbo].[Article] (
[ArticleID] INT NOT NULL IDENTITY(1, 1),
[ArticleName] NVARCHAR(200),
[Author] NVARCHAR(100),
[Summary] NTEXT
)

SELECT * FROM [dbo].[Article]
ORDER BY [Summary]

В итоге получим эту ошибку:

Msg 306, Level 16, State 2, Line 2
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Другой путь получения этой ошибки – включить колонку типа TEXT, NTEXT или IMAGE в группировку (GROUP BY), например как в этом скрипте:

Т.к. в новых версиях SQL Server типы данных ntext, text и image будут удалены, то следует избегать их использования. При использовании SQL Server версии 2005 или новее используйте типы nvarchar(max), varchar(max) и varbinary(max) соответственно.

Пути обхода

Если изменить типы в таблице нет возможности, а использовать подобные запросы необходимо, то можно воспользоваться следующим решением – преобразовать колонки типа TEXT или NEXT в тип VARCHAR или NVARCHAR непосредственно в SELECT-запросах при использовании сортировки (ORDER BY) и/или группировки (GROUP BY).

Примеры:

1) При использовании SQL Server 2000 колонка типа NTEXT может быть сконвертирована в тип NVARCHAR(4000) в условии сортировки (ORDER BY) для избежания ошибки и генерации желаемого результата:

Читайте также:  Iphone se разрешение фотографий

При использовании SQL Server 2005 или SQL Server 2008 (или новее), вместо NVARCHAR(4000), колонка типа NTEXT может быть сконвертирована в тип NVARCHAR(MAX):

2) Если необходимо сделать группировку подобных поле, поступаем также, как в примере 1.

Для SQL Server 2000:

Для SQL Server 2005 или SQL Server 2008 (или новее):

Во избежании подобной ошибки рекомендуется преобразовать все имеющиеся таблицы с подобными типами данных в типы VARCHAR(MAX), NVARCHAR(MAX) и VARBINARY(MAX) соответственно.

Работая в нефтяной компании, столкнулся с тем, что очень многие типы данных приходят в текстовых файлах. Стала задача их обрабатывать и хранить в БД. Решили некоторые файлы архивировать и загружать в БД, в поля типа image.

Почему именно так решили хранить, не спрашивайте. Это было решено задолго до того как я начал работать в этой компании

Раньше была написана внешняя утилита, которая выгружала и разархивировала эти файлы.
Я подумал, что было бы неплохо иметь хранимую процедуру, которая сама бы разархивировала эти файлы и сохраняла на диск.

Начал копать в сторону .NET. И выяснилось, что можно использовать код написанный на C# в качестве ХП SQL Server 2008. Сейчас мы с вами напишем такую ХП, которая по запросу будет нам выгружать разархивированный файл.

В качестве тестов был выбран MS SQL Server 2008 Express, который был установлен на моем локальном компьютере, и MS Visual Studio 2010.

Для начала подготовим SQL Server. Необходимо настроить старт службы из под своего пользователя, а не NETWORK SERVICE как стоит по умолчанию.

Затем выставить протокол TCP/IP в состояние Enable и в Property активировать IP, и прописать порт 1433.

Все это можно выполнить в SQL Server Configuration Manager

Коннектимся к SQL Server посредством MS SQL Server Management Studio
Запускаем скрипт по созданию таблицы:
USE [elwindb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableForTest](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ArchFile] [image] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Создаем процедуру по загрузке файлов в созданную таблицу:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[ELW_LoadFile]
@FileName nvarchar(255)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @v_sql nvarchar(2000) = ‘INSERT INTO TableForTest(ArchFile)
SELECT * FROM OPENROWSET(BULK ”’ + @FileName + ”’, SINGLE_BLOB) AS ArchFile’;
exec (@v_sql);
END
GO

Жмем «WIN+R»:

Создаем файл и сохраняем его:

Архивируем его в формате GZip. Загружаем в таблицу:
exec ELW_LoadFile ‘D:MSSQLTEMPhabrahabr.gz’

Выставляем необходимые права в SQL Server:
USE elwindb
sp_configure ‘clr enabled’, 1;
GO
ALTER DATABASE elwindb SET TRUSTWORTHY ON
GO
GRANT EXTERNAL ACCESS ASSEMBLY TO %username%
GO

Читайте также:  Устройство радиатора системы охлаждения

Далее работа в MS Visual Studio 2010. Создаем SQL Server 2008 Project, попутно указывая адрес и учетную запись SQL Server.
Выставляем настройку проекта Target Framework в .NET Framework 2.0 (Т.к. под Framework 4.0 «задеплоить» в SQL Server проект не получится, а «фичи» из Framework 3 и 3.5 нам не нужны)
Пишем такой код:
using System;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.IO;
using System.IO.Compression;

public class StoredProcedures
<
[Microsoft.SqlServer.Server.SqlProcedure]
public static void DecompressField(int ID, string TableName, string FieldName, string FilePath)
<
using (SqlConnection connection = new SqlConnection("context connection=true"))
<
connection.Open();
SqlCommand command = new SqlCommand(" SELECT " + FieldName +
" FROM " + TableName +
" WHERE > SqlDataReader reader = command.ExecuteReader();
using (reader)
<
while (reader.Read())
<
// Получаем данные из поля таблицы, которые необходимо обработать
SqlBinary bin = reader.GetSqlBinary(0);
//Создаем поток в памяти куда передаем данные из таблицы
MemoryStream ms = new MemoryStream(bin.Value);
// создаем файл на диске по указанному пути
using (FileStream fsOut = new FileStream(FilePath, FileMode.Create))
<
//Производим разархивацию
using (GZipStream gz = new GZipStream(ms, CompressionMode.Decompress))
<
int chunkSize = 65536;
byte[] buffer = new byte[chunkSize];
for (; ; )
<
// read bytes from input stream
int bytesRead = gz.Read(buffer, 0, chunkSize);
if (bytesRead == 0) break;
// write bytes to output stream
fsOut.Write(buffer, 0, bytesRead);
>
>
>
>
>
>
>
>

Выполняем Build и Deploy.

Переходим обратно в MS SQL Server Management Studio. Выполняем следующий код:
CREATE ASSEMBLY SqlServerTestCLR FROM ‘D:workProjectsVisualStudioSqlServerTestCLRSqlServerTestCLRinDebugSqlServerTestCLR.dll’ WITH PERMISSION_SET=EXTERNAL_ACCESS

PERMISSION_SET=EXTERNAL_ACCESS необходим для того, чтоб сборка имела доступ к файлам системы

После чего сборка у нас появится в Programmability->Assemblies
Переходим непосредственно к созданию ХП:
create procedure GetDecompressFile @ID int,
@TableName nvarchar(50),
@FieldName nvarchar(50),
@FilePath nvarchar(255)
as external name SqlServerTestCLR.StoredProcedures.DecompressField

Ну и проводим запуск:
execute GetDecompressFile 1, ‘TableForTest’, ‘ArchFile’, ‘D:MSSQLTEMPhabrahabr_new.txt’
И вуаля, файл на диске:

При написании статьи были использованы материалы из MSDN.

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *