Hur man ändrar owner på en tabell i SQL Server 2000, har jag undrat länge över. Därför värt att göra en minnesanteckning i bloggen, när jag väl har googlat upp det.
En webbgypsy förklarar att man anropar en stored procedure genom Query Analyser, så här:
Vi har jobbat med SQL Server nu i några år och gillar databas-typen från Microsoft. Den är robust, fungerar i alla väder och ger många trevliga verktyg att jobba med.
När man ska spara längre texter än maxstorleken för ett datapage på 8000 bytes, är det dock en del saker man bör tänka på. Speciellt om man jobbar på SQL Server 2000 och funderar på att uppgradera till SQL Server 2005 i framtiden.
Magnus Ahlqvist ger i en tråd på IDGs forum en bra förklaring till hur datapages fungerar och att storleken för index är 900 Bytes. Läs denna för att få lite insikt i hur prestandafrågor rörande textstorleken.
Vidare så kollar vi på vad det finns för alternativ för att spara texter på SQL Server 2000. Vi har varchar (max 8000 tecken - ej Unicode), nvarchar (4000 tecken - Unicode), text (2 GB data) och ntext (2GB data Unicode).
Så vill vi spara texter över 8000 Bytes på SQL Server 2000 så måste vi använda text eller ntext. Dessa datatyper sparar dock inte texter över 8000 Bytes direkt i dataraden utan endast en minnespekare till informationen. Läs mer på SearchSQLServer vilka problem detta kan leda till. Många funktioner som replace fungerar inte på datatyper som text eller ntext. Det finns dock lösningar på hur man kan köra replace på dessa typer också.
Så rådet är att använda varchar eller nvarchar i största möjliga mån. I SQL Server 2005 har ju dessa datatyper utökats med MAX-alternativet, och de kan innehålla mer data än 8000 Bytes.
Typerna text och ntext är på väg bort från SQL Server och kommer inte att stödjas i framtida versioner. Läs mer på SQL Server Helper som förklarar läget ytterligare.
När jag skrev om hur jag installerade SQL Server Express SP2 berättade jag att det var BCP-verktyget som jag ville ha. Det visade sig vara väldigt användbart även ifall syntaxen är rätt så krånglig att lära sig.
Nu tänkte jag göra en snabb genomgång för några av de kommandon som jag har lyckats använda och även hur jag har kopierat data från SQL Server 2000 till min lokala instans av SQL Server 2005 Express. De flesta av exemplen körs i en cmd-promt.
Exempel på kommandon
Först ett användbart kommando för att se om man kommer åt databaskopplingen.
Skapa en format fil som bara innehåller databasstruktur och inga data.
bcp MittDatabasNamn.dbo.MinTabell format -c -f"c:\MinFormatfil.txt" -Slocalhost\SQLExpress -T -w
Kopiera en tabell till fil.
bcp MittDatabasNamn.dbo.MinTabell out "c:\Lagringsfil.txt" -Slocalhost\SQLExpress -T -N
För att kopiera data från en fil till tabell används "in" istället för "out", så här:
bcp MittDatabasNamn.dbo.MinTabell in "c:\Lagringsfil.txt" -Slocalhost\SQLExpress -T -N
Kopiera data från SQL 2000 till SQL 2005
Med hjälp av dessa kommandon lyckades jag exportera data från SQL Server 2000 och sedan importera dem till min lokala instans, här kommer stegen jag genomförde.
1. Först skapade jag en textfil lokalt med bcp-kommandot. Denna behövde jag ha som en mall för att klistra in innehållet ur textfilen som kommer från exportdatabasen på SQL 2000. Det gick inte att kopiera denna fil direkt eftersom jag då fick ett fel som sa något som "ett ogiltigt filslutstecken <EOF> påträffades i BCP-datafilen".
2. Jag kunde inte använda bcp från cmd-promten på vår Windows2003-server men hittade en annan lösning för att exportera data till en fil. Ifrån Query Analysern körde jag följande query.
execute master..xp_cmdshell 'bcp MittDatabasNamn.dbo.MinTabell out d:\Lagringsfil.txt -SNamnPåServer -T -w'
3. Sedan kopierade jag innehållet i exportfilen till den lokala fil som skapades i steg 1.
4. Slutligen körde jag bcp-kommandot och mina data fanns på plats.
bcp MittDatabasNamn.dbo.MinTabell in "c:\Lagringsfil.txt" -Slocalhost\SQLExpress -T -N
Här är lite olika referenser som hjälpte mig på vägen.
Japp i förrgår hade jag en riktigt jobbig dag. Det började med att insåg att jag hade ett behov av att kopiera tabeller och data från vår produktionsmiljö till min lokala utvecklingsmiljö. Jag exporterade en tabell som textfil från SQL Server 2000 och hämtade hem den till min lokala maskin.
På min laptop har jag bara SQL Server Express 2005 och kunde inte hitta några funktioner för att importera data. Efter lite undersökning visade det sig att det inte finns någon funktion för detta i Management Studio.
Som tur är läste jag Euan Gardens post och i kommentarerna kunde jag läsa något om en DTSWizard som lät som var det jag behövde. Den visade sig bara finnas i SP1 av SQL Server och jag satte igång med installationen.
Det var nu det jobbiga började.. Tyckte att jag hade hittat välskriva och bra instruktioner men hade antagligen missat något viktigt. I slutet krashade det hela ordentligt.
Efter ett antal misslyckade försök kom jag på att det kanske hade släpps ett SP2, och det stämde. Jag laddade ner SP2 här och tänkte att nu ska det väl gå bättre.
Men fortfarande hade jag väldiga problem. Installationen avbröts ständigt i olika lägen. Så här höll jag på i typ 10 timmar och läste om mängder av folk som hade liknade problem.
För mig verkade det som om den gamla installationen av SQL Server var trasig. Något som jag läst kan hända om XPs automatiska rensningsprogram städar bort filerna av misstag. För jag kunde inte ens avinstallera programmet. Läste någonstans om en Hotfix som ska lösa problemet med bortstädade installerare men kan inte hitta den igen.
Efter många om och men lyckade jag iaf installera SP2 på en ny databas instans, så nu har jag två stycken. Den gamla SQLExpress (Som är helt paj) och en ny som jag döpte till SQLExpressSP2. Lite jobbigt att jag inte kunde behålla det gamla namnet eftersom jag nu måste ändra på databaskopplingarna i våra Web.config filer.
Nu har jag även börjat kolla på det verktyg som jag var efter och som finns tillgängligt för cmd-promten. Det heter Bcp.exe (DTSWizard i SP1) och kan användas till att importera tabeller från textfiler och tvärtom. Mer info om hur man använder detta kommer senare.
Så avslutningsvis så kan jag rekommendera att du verkligen ser till att följa instruktionerna om du ska installera SP1 eller SP2 till SQL Server Express 2005. Det finns uppenbarligen många fällor att gå i, eftersom rapporteringen av problem har varit så stor. Lita på mig, jag har läst en större del av utbudet.
Nu borde jag egentligen installera om hela XP på min maskin eftersom en hel del av miljön är så trasig. Men det hinner jag tyvärr inte med nu.
Har en rutin som hämtar ut olika märken för en e-handelsida. Dessa visas i en DropDownList och fylldes den av en SqlDataReader.
Nu ville jag spara dessa data i ett DataSet och lagra det i Cache-minnet för att spara på dyrbara återtrippar till databasen (SQL Server).
Efter märkena i listan skulle det stå hur många produkter som finns under varje märke, inom paranteser. Därför behövde jag göra en ny kolumn och sätta ihop två värden och lägga till egna tecken.
//Hämta cachad data om det finns if (Cache[strCacheName] != null) { dataSet = (DataSet)(Cache[strCacheName]); Trace.Write("//Hämta cachad ChooseBrand"); } else {
SqlConnection conn = new SqlConnection(strConn);
string strSQL = "SELECT DISTINCT Brand.Id, Brand.Brand,(SELECT Count(Product.Id) AS CountOfProductId FROM Product WHERE Product.BrandId=Brand.Id) AS CountOfProducts FROM Brand ORDER BY Brand.Brand";
Jobbar med ett kluster på tre Windows 2003-burkar. Vi har SQL Server installerade på två av dessa men operativsystemet är 32-bitar på den ena och 64-bitar på den andra.
Jag har försökt att övervaka hur databasen jobbar genom verktyget Perfmon men kunde inte se några räknare på 64-servern. Nu förstår jag varför.
Eftersom operativet är 64-bitar så laddas bara processer som körs i 64-läge. SQL Server 2000 ligger fortfarande och puttrar på 32-bitar och därför kom de inte med i Perfmon-listan.
Tony Rogersson's bloggpost var till stor hjälp för att komma till insikt med detta. Skriv helt enkelt in följande för att starta upp en Perfmon för 32-bitars-processer.
Behövde just byta namn på en databastabell (SQL Server) och försökte göra det i Visual Studio. Det fanns dock inte något alternativ hur jag en försökte. Funderade givetvis på att öppna SQL Server Management men det är ju ganska jobbigt.
Efter lite googlande hittade jag en lösning som inte är helt uppenbar.
Select * Into [DestinationTableName] From [SourceTableName]
Vill man inte ha med data utan bara strukturen kan man använda följande SQL.
Select * Into [DestinationTableName] From [SourceTableName]) Where 1 = 2
Av någon anledning fungerade inte ovanstående skript i SQL Query Analyzer men det beror nog på att jag i mitt fall hade en tabell med namnet "Admin". Den klagade på Invalid object eller likande. Det hela gick bra när jag körde det genom en asp.net applikation.
Filen Web.sitemap i Asp.Net är väldigt användbar. Om man som jag redan har utvecklat ett CMS-system i Asp.Net 1.1 så kan man ju skapa den dynamisk från SQL Servern. Det är ju lite extra jobb att skriva in alla sina url:er och metadata igen.
Här kommer jag skriva lite om hur man genomför databas transaktioner i Asp.Net. Alltså så man kan välja att genomföra eller att avbryta en uppdateringen i databasen beroende på andra faktorer. Exemplen är för SQL Server.
SqlTransaction trans = null; try { conn = new SqlConnection ( . . . ); conn.Open(); trans = conn.BeginTransaction(); cmd = new Command(); cmd.Connenction = conn; cmd.Transaction = trans; cmd.ExecuteNonQuery();