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.
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
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 ...
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?
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?
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.
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.