Toon posts:

[SQL Server] nText en RPC-Stored Procedures

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi,

In de search, google niks gevonden, dus...

Ik wil door middel van Stored Procedures en een Linked Server (genaamd 'Live') data kopieren van de ene Server naar de andere.
Dit lukt allemaal prima door gewoon 'exec Live.SP_Naam param1, param2, etc.'
Maar nu wil ik ook nText fields (blob's dus) wil ook overblazen. Nu heb ik gehoord dat je dit niet als parameter kan meegeven aan een SP, hier kan ik me natuurlijk wel wat bij voorstellen, maar hoe moet het dan wel?

Want je moet natuurlijk wel een blob kunnen overblazen? Toch :?

PS het gaat er eigenlijk om om meer dan 4000 karakters over te blazen, maar dan moet je wel nText gebruiken...

Verwijderd

Je kunt gewoon een ntext, image of text type parameter gebruiken in een stored proc. Zie books online CREATE PROCEDURE bij datatype:

data_type

Is the parameter data type. All data types, including text, ntext and image, can be used as a parameter for a stored procedure. However, the cursor data type can be used only on OUTPUT parameters. When you specify a data type of cursor, the VARYING and OUTPUT keywords must also be specified. For more information about SQL Server - supplied data types and their syntax, see Data Types.


Waar je mee in de war bent is dat je geen local variables kunt declareren in een stored proc van het type text, ntext of image.

Verwijderd

Topicstarter
^ kick ^

Ik ben vandaag het bovenstaande geprobeerd te realiseren, maar...

het meegeven van nText aan een sp lukt nu zonder problemen, maar alleen als ik expliciet een string als parameter meegeef. Dus bv:
code:
1
LIVE.LIVEDB.dbo.sp_test 'nText string, die flink lang kan zijn...'

Ook als ik een string van 10.000 karakters meegeef werkt dit perfect.
Het probleem is echter dat ik de sp aanroep in een cursor, en de parameter ophaal uit een andere tabel.
Aangezien ik geen locale variabele als nText kan definieren, heb ik het geprobeerd met die varBinary(16) en dan met TEXTPTR(fieldName) de pointer ophalen. Dan kan ik ook wel met READTEXT een deel van die pointer uitlezen, alleen zijn er nu twee problemen:
1) Hoe kan ik de gehele waarde uitlezen (de lengte is niet van te voren bekend)
2) Hoe kan ik die gehele string tenslotte meegeven aan de SP?

Bij voorbaat dank :)

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Ik weet niet of het real time of batch moet gebeuren dat kopieren, maar als het nou niet real time hoeft kan je dan niet beter dts gebruiken?

Verwijderd

Topicstarter
Het is real-time, en de SP wordt trouwens ook aangeroepen vanuit een DTS...
Maar dat heeft niks met het probleem te maken. Want is het überhaupt mogelijk om nText in een cursor mee te geven aan een sp :?

Verwijderd

Beste dames en heren,

Ik blaas deze post weer even nieuw leven in aangezien ik hetzelfde probleem heb als de persoon die dit topic heeft geopend. Ik ben ook bezig om data vanuit een database te kopieren naar een andere. De data moet in de andere database wel worden geinsert. De records bestaan dus nog niet.

Nu werkt het kopieren en inserten wel via de cursor alleen heb ik ook te maken met ntext velden. Een BLOB dus. Ook hier kom ik tot het punt dat ik wel de pointer op kan halen, alleen weet ik dan niet hoe ik de text waarnaar de pointer verwijst kan inserten in de nieuwe database..

Iemand die hier wat meer over weet?

  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Al eens naar de READTEXT en WRITETEXT functies gekeken ?

https://fgheysels.github.io/


Verwijderd

whoami schreef op dinsdag 13 september 2005 @ 13:24:
Al eens naar de READTEXT en WRITETEXT functies gekeken ?
Tja dit heb ik inderdaad geprobeerd.
Ik zal even posten hoe ver ik nu ben.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE PROCEDURE [dbo].[ExportReperatieTemplateDataToReparatie] As

DECLARE c_Acties CURSOR
FOR
 SELECT ActieId,CorporatieId,Trefwoord,textptr(Omschrijving),Plaatje,Creator,CreationDate,Modifier,ModifiedDate,Deleted
 FROM dbo.tbl_Acties
OPEN c_Acties
DECLARE @v_ActieId int
DECLARE @v_CorporatieId int
DECLARE @v_Trefwoord nvarchar(50)
DECLARE @p_Omschrijving binary(16)
DECLARE @v_Plaatje nvarchar(50)
DECLARE @v_Creator nvarchar(50)
DECLARE @v_CreationDate datetime
DECLARE @v_Modifier nvarchar(50)
DECLARE @v_ModifiedDate datetime
DECLARE @v_Deleted bit
BEGIN
 FETCH NEXT FROM c_Acties INTO @v_ActieId,@v_CorporatieId,@v_Trefwoord,@p_Omschrijving,@v_Plaatje,@v_Creator,@v_CreationDate,@v_Modifier,@v_ModifiedDate,@v_Deleted
 WHILE (@@FETCH_STATUS = 0)
  BEGIN
   INSERT INTO Reparatie.dbo.tbl_Actie(ActieId,CorporatieId,Trefwoord,Omschrijving,Plaatje,Creator,CreationDate,Modifier,ModifiedDate,Deleted)
   VALUES (@v_ActieId,@v_CorporatieId,@v_Trefwoord,READTEXT dbo.tbl_Actie.Omschrijving @p_Omschrijving,@v_Plaatje,@v_Creator,@v_CreationDate,@v_Modifier,@v_ModifiedDate,@v_Deleted)  
   FETCH NEXT FROM c_Acties INTO @v_ActieId,@v_CorporatieId,@v_Trefwoord,@p_Omschrijving,@v_Plaatje,@v_Creator,@v_CreationDate,@v_Modifier,@v_ModifiedDate,@v_Deleted
   CONTINUE
  END
END
CLOSE c_Acties
DEALLOCATE c_Acties

GO


Dit READTEXT gedeelte word alleen niet geaccepteerd. Ik weet niet goed hoe ik het anders zou moeten toepassen.

Verwijderd

Weet iemand om te gaan met hoe je van de ene naar de andere database velden kan copieren door middel van de READTEXT,WRITETEXT en UPDATETEXT fucties.

Ik heb hier een voorbeeldje van mijn probleem

code:
1
2
3
4
5
6
7
8
9
10
11
12
DECLARE @p_BlobCullomName_van_tbl binary(16)
DECLARE @p_BlobCullomName_naar_tbl binary(16)

SELECT @p_BlobCullomName_van_tbl = textptr(BlobCullomName)
FROM Database1.tableName
WHERE Id = 1
READTEXT Database1.tableName.BlobCullomName @p_BlobCullomName_van_tbl 0 16

SELECT @p_BlobCullomName_naar_tbl = textptr(BlobCullomName)
FROM Database2.tableName
WHERE Id = 1
UPDATETEXT Database2.tableName.BlobCullomName @p_BlobCullomName_naar_tbl 0 NULL


Het idee wat ik heb is dat ik eerst de data lees en daarna wegschrijf in de andere database.
Dit werkt helaas niet zo.

Hoe kan ik anders de juiste data meegeven aan de UPDATETEXT Functie????????

[ Voor 4% gewijzigd door Verwijderd op 13-09-2005 16:24 ]


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Waarom gebruik je eigenlijk een cursor?
Werkt het niet om gewoon het volgende te doen:
SQL:
1
2
INSERT INTO database1..table1 (ntextveld, anderveld)
SELECT ntextveld, anderveld FROM database2..table2


/disclaimer: Ik moet toegeven dat ik je codevoorbeeld niet goed heb bekeken, dus misschien mis ik wat info. In dat geval vergeet maar wat ik heb gezegd.

Today's subliminal thought is:


Verwijderd

Annie schreef op dinsdag 13 september 2005 @ 18:00:
Waarom gebruik je eigenlijk een cursor?
Werkt het niet om gewoon het volgende te doen:
SQL:
1
2
INSERT INTO database1..table1 (ntextveld, anderveld)
SELECT ntextveld, anderveld FROM database2..table2


/disclaimer: Ik moet toegeven dat ik je codevoorbeeld niet goed heb bekeken, dus misschien mis ik wat info. In dat geval vergeet maar wat ik heb gezegd.
De cursor is nodig omdat ik alle rijen moet copieren naar de andere tabel. Een insert op jouw manier zou inderdaad mogelijk zijn als je niet met Blob's te maken hebt.

Iemand anders een betere suggestie?

Verwijderd

Beste heren het is al opgelost.

code:
1
2
3
4
5
6
7
8
9
BEGIN
    SELECT @pointer1 = textptr(Collum)
    FROM db1.dbo.table
    WHERE Id=1
    SELECT @pointer2 = textptr(Collum)
    FROM db2.dbo.table
    WHERE Id=1
    UPDATETEXT db1.dbo.table.Collum @pointer1 0 NULL db2.dbo.table.Collum @pointer2
END


Als je naar de code kijkt zie je dat er eerst een pionter naar beide velden wordt opgehaald.
Vervolgens kan je een UPDATETEXT statement aanroepen met beide pionters.

De data die in het ene ntext veld staat wordt gecopieerd naar de andere database tabel.

[ Voor 23% gewijzigd door Verwijderd op 14-09-2005 09:34 ]


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Verwijderd schreef op woensdag 14 september 2005 @ 08:40:
[...]


De cursor is nodig omdat ik alle rijen moet copieren naar de andere tabel. Een insert op jouw manier zou inderdaad mogelijk zijn als je niet met Blob's te maken hebt.

Iemand anders een betere suggestie?
Werkt het ook niet als je de TEXTSIZE op max zet?

SQL:
1
SET TEXTSIZE 2147483647

Today's subliminal thought is:

Pagina: 1