Здравствуйте, sadomovalex, Вы писали:
разобрался с вопросом.. ссылка для потомков
http://www.sql.ru/forum/actualthread.aspx?tid=310301
всем привет
поискал по форуму, погуглил — к своему удивлению удовлетворительного ответа не нашел
чтобы записать данные типа image в таблицу, нужно получить валидный указатель на страницу. Цитата из BOL:
To create a text pointer, execute an INSERT or UPDATE statement with data that is not NULL for the text, ntext, or image column
и далее:
Inserting a null value into a text or image column does not create a valid text pointer, nor does it preallocate an 8-KB text page
Соответственно возникает вопрос: что использовать в качестве этого ненулевого значения при insert-е в столбец типа image? В случае text/ntext можно использовать к примеру пустую строку, а с image непонятно
вот код:
CREATE TABLE [dbo].[attachment] (
[AttachmentId] [int] IDENTITY (1, 1) NOT NULL ,
[Name] [nvarchar] (255) NOT NULL ,
[Content] [image] NOT NULL ,
[Type] [nvarchar] (10) NOT NULL ,
[MailId] [int] NOT NULL
) ON [PRIMARY]
...
/**************************************************************************************/
/**/
CREATE PROCEDURE up_InsertAttachment
@name nvarchar (255),
@content image,
@type nvarchar(10),
@mailId int
AS
-- чтобы это сделать надо добавить DEFAULT значение для поля Content. Какое???
INSERT INTO attachment ([Name], Type, MailId)
VALUES (@name, @type, @mailId)
DECLARE @attachmentId int
SET @attachmentId = SCOPE_IDENTITY()
DECLARE DECLARE @ptr binary(16)
SELECT @ptr = TEXTPTR(Content)
FROM attachment
WHERE AttachmentId = @attachmentId
WRITETEXT attachment.Content @ptr @content
GO
Любая последовательность байтов прокатит. Например так:
INSERT INTO attachment ([Name], Type, MailId, Content)
VALUES (@name, @type, @mailId, 0xDEADBEEF)
Здравствуйте, RiskServer, Вы писали:
RS>Любая последовательность байтов прокатит. Например так:
RS>RS>INSERT INTO attachment ([Name], Type, MailId, Content)
RS>VALUES (@name, @type, @mailId, 0xDEADBEEF)
RS>
меня смущает то, что для данных типа image в столбце хранится не данные, а указатель. Соответственно 0xDEADBEEF — это какой-то адрес в памяти, и если я захочу изменить содержимое этого поля с помощью UPDATETEXT или WRITETEXT, то перетру данные по этому адресу. Или я не прав?