Ändra owner på tabell i SQL Server 2000

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:

exec sp_changeobjectowner 'OldOwnerName.MyTableToModify','MyNewOwner'
By Jesper Lind

Spara långa texter i SQL Server

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.

By Jesper Lind

Kopiera data från SQL2000 till SQL2005 med BCP

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.

sqlcmd -Slocalhost\SQLExpress

Sen går vi in på själva bcp-kommandona, en referens för syntaxen finns på MSDN.

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.

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1071667&SiteID=1

http://simple-talk.com/sql/database-administration/creating-csv-files-using-bcp...

http://www.issociate.de/board/post/180881/BCP_Format_File.html

http://msdn2.microsoft.com/en-us/library/ms162802.aspx

http://msdn2.microsoft.com/en-us/library/ms191212.aspx

By Jesper Lind

SQL Server Express SP2 - installationen från helvetet

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.

Jag provade att använda Windows Installer Clean Up för att rensa bort trasiga installerare men vet inte om det var en sån bra ide. Försökte även med "How to uninstall an instance of SQL Server 2005 manually" och hackade mitt register en hel del, men inget hjälpte.

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.

By Jesper Lind

Kombinerad kolumn i dataset och spara i cacheminne

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.

Inlägget "SubString in an ADO.NET DataSet - (DataColumn Expression)" på CodeBetter.com visar hur man gör en nya kolumn med en SubString och som lägger till tre prickar efteråt.

ds.Tables["Customers"].Columns.Add("ShortCompanyName", typeof(string),"Substring(CompanyName, 1, 10) + '...'");

Med hjälp av började jag förstå hur syntaxen för hur DataColumn.Expression fungerar.

Här är själva kodsnutten som kombinerar två värden och skriver det sista inom paranteser.

dataSet.Tables["ChooseBrand"].Columns.Add("BrandWithCount", typeof(string), "Brand + ' (' + CountOfProducts + ')'");

Här är större del av koden som även visar hur man lägger in ett DataSet i Cache.

private void BindBrand()
{

ddlBrand.Items.Clear();

DataSet ds = LoadBrand();

ddlBrand.DataSource = ds;
ddlBrand.DataSource = ds.Tables[0];
ddlBrand.DataTextField = ds.Tables[0].Columns["BrandWithCount"].ColumnName.ToString();

ddlBrand.DataValueField = ds.Tables[0].Columns["Id"].ColumnName.ToString();
ddlBrand.DataBind();

ListItem titleItem = new ListItem((string)this.GetLocalResourceObject("ChooseBrand"), "0");
ddlBrand.Items.Insert(0,titleItem);

}

protected DataSet LoadBrand()
{
Trace.Write("LoadBrand()");
DataSet dataSet = new DataSet();

string strCacheName = "ChooseBrand";
//Cache.Remove(strCacheName);

//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";

try
{
SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQL, conn);
dataAdapter.Fill(dataSet, "ChooseBrand");
dataAdapter.Dispose();
dataAdapter = null;


//Lägg till custom kolumn
dataSet.Tables["ChooseBrand"].Columns.Add("BrandWithCount", typeof(string), "Brand + ' (' + CountOfProducts + ')'");

Cache.Insert(strCacheName, dataSet, null, DateTime.Now.AddMinutes(21), TimeSpan.Zero);
Trace.Write("//Lägg in ChooseBrand i cachen");
}
catch (Exception objException)
{
Trace.Warn("LoadChooseBrand() Fel!", objException.Message);
}
finally
{
if (conn != null)
{
conn.Close();
conn = null;
}
}
}
return dataSet;
}

By Jesper Lind

Perfmon-räknare saknar 32-bitars processer

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.

mmc /32 perfmon.msc

By Jesper Lind

Namnbyte på databastabeller i Visual Studio

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.

  1. Skapa / Öppna ett databasdiagram
  2. Lägg till tabellen du vill byta namn på
  3. Högerklicka på tabellen och välj egenskaper
  4. Nu kan du ändra namnet på tabellen
  5. Stäng egenskaper
  6. Spara diagrammet och namnbytet är klart
By Jesper Lind

Kopiera tabeller med data i SQL Server

Detta är något jag undrat länge över hur man gör i SQL Server. I en forumstråd hittade jag lösningen på hur man kopierar hela tabeller inklusive data.

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.

By Jesper Lind

Transaktioner med Asp.net

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();

}
catch(Exception objException)
{
if(trans!=null)
trans.Rollback();
}
finally
{
if(conn!=null)
conn.Close();
}

Mer läsning
Läs en artikel om hur man kan koppla en transaktion till en OleDbDataReader. http://www.c-sharpcorner.com/asp/Code/TransactionsInASPNETDPL.asp

By Jesper Lind