Toon posts:

[MSSQL] bytes toevoegen aan een IMAGE veld

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi allemaal,

Ik vraag me af hoe ik 100.000 bytes kan toevoegen aan een IMAGE veld. Ik heb dit geprobeerd:

WRITETEXT Table1.ColumnA @ptrval REPLICATE(CHAR(0),100000)

Maar dat werkt niet. Het maakt wel duidelijk wat ik wil doen:

Wanneer ik een nieuw record toevoeg aan Table1 wil ik 100.000 bytes (met waarde 0) toevoegen aan ColumnA. Het aantal bytes wat moet worden toegevoegd kan per record verschillen.

Ik zou het heel erg waarderen als iemand mij zou willen helpen, want ik kom er echt niet meer uit.

Bij voorbaat dank.

Met vriendelijke groeten,

R. Schuil

Verwijderd

INSERT INTO Table1 (ColumnA) VALUES (REPLICATE(CHAR(0),100000))

Verwijderd

Topicstarter
Als ik bovenstaande oplossing probeer worden er maar 8000 bytes gereserveerd..?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

row's in mssql zijn toch maximaal 8000 bytes?

Of gold dat niet voor blob's/images? :)

Verwijderd

Op woensdag 22 mei 2002 12:27 schreef ACM het volgende:
row's in mssql zijn toch maximaal 8000 bytes?

Of gold dat niet voor blob's/images? :)
Nee :) blobs en textfields worden buiten de 4Kpages opgeslagen in een aparte store. In de fields in de records staan dan ook 16byte pointers naar de pages.

Topicstarter: Books online heeft een example waarin staat hoe je een pointer kunt verkrijgen naar een blob, die kunt positioneren en dan de data kunt toevoegen. Er is wel een verschil tussen SQLserver 7 en SQLServer 2000 mbt pointers naar blobs/textfields.

Verwijderd

Beetje dom maar misschien zo?

DECLARE @ptrval binary(16)
INSERT INTO (Table1) VALUES (REPLICATE(CHAR(0),2000))
SELECT @ptrval = TEXTPTR(ColumnA) FROM Table1 WHERE id = @@IDENTITY
DECLARE @FILL varchar(8000)
SELECT @FILL = REPLICATE(CHAR(0),80000)
UPDATETEXT Table1.ColumnA @ptrval 0 0 @fill

Verwijderd

Topicstarter
Er moet toch wel gewoon een degelijke manier zijn om er door een stored procedure een hoop data in te zetten?
De oplossing hierboven werkt wel,maar het is lastig om dat met variabele lengte te doen en het liefst zou ik het met 1 write doen en niet beetje bij beetje

Verwijderd

Je kunt dit ook middels een image parameter meegeven aan de stored proc en die parameter gewoon net als andere parameters in de insert call plaatsen:

CREATE PROCEDURE foo
@blobImage image,
@iKey int
AS
INSERT table (Key, Image) VALUES (@iKey, @blobImage)

100K per call naar die stored proc jetsen is niet erg efficient als je dat 10.000 keer per minuut moet doen, maar indien dat dus je parten speelt, waarom wil je uberhaupt die imagefields initializen ?

Verwijderd

Topicstarter
Goed, ik zal wat meer uitleg geven over mijn doel:

Ik ben bezig "bloom filters" te implementeren in MSSQL. Bloomfilters zijn bitreeksen die gebruikt worden om te checken of een bepaalde waarde voorkomt in een collectie. Eerst wordt een hash K berekend voor de waarde en dan wordt aan de K bit in de bitmap (IMAGE veld in db) waarde 1 toegekend. Als men wil checken of de waarde eerder is gezien dan hoeft men alleen te controleren of de bitwaarde op die positie gelijk is aan 1. Waarde 1 wil zeggen: het is mogelijk dat de waarde voorkomt en waarde 0 betekent dat de waarde zeker niet voorkomt.

Goed, dat is dus waarom ik de IMAGE velden gebruik. Maar om een bloomfilter te maken moet ik eerst een heleboel 0-bits hebben, vandaar dat ik een bijv. 100.000 bytes met ascii waarde 0 wil toevoegen. Dat zou dus goed zijn voor 800,000 waarden in mijn bloomfilter.

Uiteindelijk wil ik deze methode gebruiken voor mijn routing protocol in mijn peer-to-peer zoekmachine maar dan moet ik 'em wel aan de praat krijgen.

Ik had ook al gedacht om anders een 'flat'-file te gebruiken om de bitmaps in op te slaan, en dan de pointers opslaan in de tabel (feitelijk BLOB nabouwen :p). Alleen ben ik dan een aantal features zoals replication en clustering kwijt..

Verwijderd

Dit moet je niet in een database doen. Tenzij je je hashkeys gewoon als fieldvalues opslaat in een tabel. SELECT query eroverheen en klaar ben je. Dat is IMHO sneller dan de blob uit sqlserver trekken en een bitwise AND op een zekere positie doen.

Verwijderd

Topicstarter
Op woensdag 22 mei 2002 18:03 schreef Otis het volgende:
Dit moet je niet in een database doen. Tenzij je je hashkeys gewoon als fieldvalues opslaat in een tabel. SELECT query eroverheen en klaar ben je. Dat is IMHO sneller dan de blob uit sqlserver trekken en een bitwise AND op een zekere positie doen.
Ik lees niet de hele blob uit, maar alleen de byte die ik nodig heb. Dan voer ik daar een bitwise AND op uit en schrijf ik die weg met UPDATETEXT. Dat zal ongetwijfeld iets langzamer zijn dan een flat-file, maar het verschil is niet zo extreem zoals wanneer je de hele blob uitleest.
Pagina: 1