Avatar billede jytte Nybegynder
07. august 2010 - 10:56 Der er 13 kommentarer og
1 løsning

indsæt over 8000 tegn i text-felt

Kan man med en insert-sætning indsætte flere end 8000 tegn i et text-felt?

Når jeg prøver bliver der kun indsat de første 8000 tegn.
Avatar billede keysersoze Guru
07. august 2010 - 11:26 #1
Det lyder som om du benytter et varchar-felt og ikke text-felt?

http://msdn.microsoft.com/en-us/library/aa258271(SQL.80).aspx
Avatar billede janus_007 Nybegynder
07. august 2010 - 14:53 #2
Du skal deklarere din felttype i tabellen til varchar(max)
Avatar billede jytte Nybegynder
07. august 2010 - 23:30 #3
Jeg benytter et text-felt.

Jeg har fundet ud af at når jeg skriver min insert-sætning i query-anlyseren og forsøger at indsætte en streng på over 8000 tegn så er det kun de første 8000 tegn der bliver indsat.

Først troede jeg at det kun var selve queryanalyzeren der havde denne begrænsning. Men da jeg udførte sql-sætningen inde fra min ASP.Net kode fik jeg samme resultat - kun de første 8000 tegn indsat.

I begge situationer havde jeg sat enkelt stroffer omkring
min streng.

Men da jeg i min kode lavede det om så min query blev parameterized - dvs noget i retningen af

sql = "insert into min_tabel(min_lange_streng) values (@lang_streng);" & vbCrLf
mycon = New SqlConnection(connectionstring)
myCmd = New SqlCommand(str, mycon)
mycon.Open()
myCmd.Parameters.Add(New SqlParameter("@lang_streng", Data.SqlDbType.text)).Value = 'meget lang streng ..'
myCmd.ExecuteNonQuery()

kunne jeg få indsat min meget lange streng uden at der blev skåret af ved 8000 tegn.
Avatar billede jytte Nybegynder
07. august 2010 - 23:32 #4
Hvis ikke der er nogen der kan give mig en forklaring på hvorfor min uparametriserede insert kun vil indsætte 8000 tegn, tillader jeg mig selv at tage mine udlovede point
Avatar billede Syska Mester
08. august 2010 - 00:33 #5
Ja, og det er der en simple årsag til ... da du ikke angiver hvad type det er ... så gætter den sig frem. Den gættede så forkert.

Løsningen er som du selv siger ... at bruge parameters.

Men det virker altså også i SSMS. Hvordan laver du din query der ?

mvh
Avatar billede Syska Mester
08. august 2010 - 00:35 #6
Vi gætter os også frem ... da du ikke viser os noget kode :-)

Derfor man kan jo ramme forkert. Men der er ingen tvivl om de 2 første kommentare var spot on, ud fra din fejl beskrivelse.
Avatar billede Syska Mester
08. august 2010 - 00:37 #7
btw det med point.

Kom med din tidligere kode der ikke virkede, så er der helt sikkert en af os der skal komme med en forklaring. Jeg vil næsten vove at påstå at både .NET og SSMS gætter på det er en varchar du vil indsætte ...

mvh
Avatar billede jytte Nybegynder
09. august 2010 - 13:49 #8
>buzzzz

Kan man bruge parameters med typeangivelse i SSMS?

Det vil jeg meget gerne se et eksempel på.

I .NET kan jeg lave parameters og angive type og derfor virker det der.
Avatar billede Syska Mester
09. august 2010 - 13:56 #9
Ja, det kan du godt skal lige finde det.

Linq2sql etc gør det.

Kan du ikke poste hvordan du gør nu, for jeg kan nemlig ikke få det til at fejle ... med en table med et Text fejl, og der kan jeg nemt indsætte 10k tegn uden type angivelse fra SSMS.

Hvad version af MSSQL bruger du? og hvad version af SSMS?

mvh
Avatar billede Syska Mester
09. august 2010 - 13:59 #10
http://www.mssqltips.com/tip.asp?tip=1160

Se eksempel 3 på den side ... sp_exectesql
Avatar billede jytte Nybegynder
09. august 2010 - 15:06 #11
>buzzzz

Min SSMS(SQL Server Management Studio) har version 10.0.1600.22
Jeg ved ikke hvodan jeg ser versionen af MSSQL

Når jeg laver en helt almindelig insert (uden nogen @´er) og indsætter en streg på over 8000 tegn udfører den sætningen uden at give nogen fejlmelding, men der bliver kun indsat de første 8000 tegn.

dit eksempel er en stored procedure (dem er jeg ikke så skrap til) så jeg kan ikke lige gennemskue om slutningen af eksemplet svarer til en parametrisering med typeangivelse?
Avatar billede Syska Mester
09. august 2010 - 15:34 #12
problemet er netop at du også får "Cache plan polution" tror jeg de kalder det.

Når den gætter sig frem ... dvs

UPDATE table1 SET table = '123' WHERE ID = 10
UPDATE table1 SET table = '1234' WHERE ID = 10

Overstående vil lave 2 plan caches, da den højst sandsynlig vil tolke den ene com VARCHAR(3) og den anden som VARCHAR(4)

Det er værd at tænke over, og altid bruge paramerters og angive hvad type du vil indsætte ... da den så kan genbruge en tidligere plan cache.

Nej, men linket skulle gerne virke hvis man fyrer sådan en query af.

DECLARE @sqlCommand nvarchar(1000)
DECLARE @columnList varchar(75)
DECLARE @city varchar(75)
SET @columnList = 'CustomerID, ContactName, City'
SET @city = 'London'
SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city

Du kan jo så skifte det ud med hvad du vil ... jeg kan ikke lave det om til din query da jeg stadig ikke har set den. Så jeg kan heller ikke teste om det fejler på mit system.

mvh
Avatar billede jytte Nybegynder
27. december 2010 - 21:18 #13
Ups, Undskyld jeg har glemt at tjekke min email længe.

Buzzzz: Tak for dit svar - det må jeg prøve næste gang jeg har brug for det.

Læg et svar så får du point.
Avatar billede Syska Mester
28. december 2010 - 20:11 #14
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester