Posts Tagged ‘SQL’

When the need comes to port tables from one server / database to another server / database there is an easy way than creating the tables manually and importing data into table.

By using the following query you can import the table structure and the data of the required table.

  1. SELECT *
  2. INTO [DestinationServerName\SQLServerInstanceName].[DestinationDatabaseName].[OwnerName].[DestinationTableName]
  3. FROM [SourceServerName\SQLServerInstanceName].[SourceDatabaseName].[OwnerName].[SourceTableName]

Using the above method you can transfer tables between different databases, Server instances or different database servers.

Consider the following example in which I am transferring the Customers table from Northwind database to my Test database.

  1. SELECT *
  2. INTO [Test].[dbo].[Customers]
  3. FROM [Northwind].[dbo].[Customers]

Here SELECT statement will behave the same way as in a normal SELECT * FROM TableName statement meaning you can use all the techniques used in SELECT statements to filter the data needed to be ported. For example following query will only bring customers who are from UK.

  1. SELECT *
  2. INTO [Test].[dbo].[Customers]
  3. FROM [Northwind].[dbo].[Customers]
  4. WHERE Country = 'UK'

One thing to remember is, this method will not import the keys, meaning if you had a primary key set to CustomerId it will not exist in your new table. So you need to add the keys (primary and secondary) to the new table to match it with the source table. If you had identity specification turned on in your source table this will set it for you, so you do not need to set it again.

If you are into programming you should have definitely worked with calculated fields in SQL. But for others I will briefly explain what they are.

Calculated columns are columns which depend on other columns. It gets its value by calculating which can involve values of other columns. The calculation formula is the only thing stored in the column.

So each time the column is referenced the calculation is done. But if you use the keyword “persisted” while creating the column then the values will be kept in the table. Whenever a referenced value is updated the computed column is also automatically updated to highlight the change. Also by using persisted you can index a computed column.

You can create a table with persisted computed column as follows.

  1. CREATE TABLE Customer
  2. (
  3. CustomerId INT IDENTITY(1, 1) NOT NULL,
  4. CustomerFirstName NVARCHAR(100) NOT NULL,
  5. CustomerLastName NVARCHAR(100) NOT NULL,
  6. CustomerFullName AS CustomerFirstName + ' ' + CustomerLastName PERSISTED
  7. )

One thing to remember is that you cannot directly insert values to a computed column.

I think you got a basic idea of computed columns. Now I would like to show how to create a computed column dynamically. For example think that you need to add a computed column to a table using a stored procedure. It is not a big deal.

I need to insert a TotalOrder column to the table named FoodOrder.

  1. CREATE TABLE FoodOrder
  2. (
  3. OrderId INT IDENTITY(1, 1) NOT NULL,
  4. OrderDate SMALLDATETIME NULL,
  5. CustomerName NVARCHAR(100) NOT NULL,
  6. TotalStarter INT NULL,
  7. TotalMainCourse INT NULL,
  8. TotalSoftBevarage INT NULL,
  9. TotalLiquer INT NULL,
  10. TotalDessert INT NULL
  11. )

This can be done using the following query.

  1. DECLARE @sExecuteCommand VARCHAR(250), –Keepa the command to be executed.
  2. @sColumns VARCHAR(150) –Keeps the columns to be included in the formula.
  3.  
  4. SET @sColumns = 'TotalStarter+TotalMainCourse+TotalSoftBevarage+TotalLiquer+TotalDessert+'
  5. SET @sExecuteCommand = 'ALTER TABLE FoodOrder ADD TotalOrder AS ' + SUBSTRING(@sColumns, 1, LEN(@sColumns)-1) — Creating the computed column.
  6. EXEC (@sExecuteCommand)

Note that a cursor or a loop can be easily used to populate the variable “sColumns” with the columns required for the formula.

Hope this helps.

UPDATE with JOIN

Posted: January 30, 2012 in SQL Server
Tags: , , , , , ,

If you need to update data of a table (DestinationTable) with data of another table (SourceTable) there are 3 ways you can get this done in SQL.

Method 1

This is the most common and simple way with using a sub query.

  1. UPDATE DestinationTable SET DestinationColumn =
  2.     (SELECT ValueColumn FROM SourceTable WHERE DestinationTable.MappingColumn = SourceTable.MappingColumn)

 

Method 2

This users the most common FROM clause to join the two tables as shown below.

  1. UPDATE DestinationTable SET DestinationColumn = SourceTable.ValueColumn
  2. FROM SourceTable
  3. WHERE DestinationTable.MappingColumn = SourceTable.MappingColumn

 

Method 3

Last method mentioned below uses the join clause to join both the tables to make the update happen properly.

  1. UPDATE DestinationTable SET DestinationColumn = SourceTable.ValueColumn
  2. FROM DestinationTable
  3. INNER JOIN SourceTable ON DestinationTable.MappingColumn = SourceTable.MappingColumn

 

Hope these helps.

Recently after restoring a database backup which I got from another server I repeatedly encountered an error when logged in using a user who is given permission. But when ‘sa’ account is used I could work with the database without any problem.

The error message was “The database DATABASE NAME is not accessible. (ObjectExplorer)” which was not helpful since it didn’t give any clue to figure out the issue.

image

Later I found that the issue is because the user in the restored database is not properly mapped to the user in the new server and the resolution for this is to run the stored procedure sp_change_users_login to correct the orphaned user.

  • sp_change_users_login ‘update_one’, ‘USER’, ‘LOGIN’ – Links the given user in the current database to the specified login.
  • sp_change_users_login ‘auto_fix’, ‘USER’ – Links the given user in the current database to the login having the same name in the current server.

After running this you will be able to access the restored database without any issue using the mentioned database user.

Have you noticed that with the default settings of SQL Server 2008 R2 you cannot use the design view to edit and save table changes which requires table to be recreated. But if you used earlier SQL Server installations you should remember that this functionality was possible. When you try to save such a table you will see an error similar to the following in SQL Server 2008 R2.

But the good news is that we can enable this functionality by going to SQL Server options.

Click Tools –> Options and expand Designers node and select ‘Table and Database Designers’.

Then uncheck the option ‘Prevent saving changes that require table re-creation’ and press OK.

Now if you try to save the table changes SQL will do the alteration without any complains.

Today when I tried to install SQL Server 2008 R2 I couldn’t change the shared feature installation directory in the setup. Both the textbox and browse button were disabled restricting me to select the desired path.

After sometime I found the cause for this. It is because there were some SQL related programs already installed in my computer, because they are there the SQL setup uses the same directory to setup the rest of the programs.

If you need to relocate the install directory then simply you need to uninstall all the SQL related programs using Programs and Features and re-run the SQL Server setup. Then the browse buttons will be active enabling you to select an alternate location.

Recently in one of my virtual servers I got the above error when trying to open the SQL Server Reporting Services (SSRS).

If this is happening to you I recommend checking the following things in your server.

1. Remote Connections in SQL Server.

Go to Start –> All Programs –> Microsoft SQL Server 200x –> Configuration Tools and open SQL Server Configuration Manager.

Now check whether the TCP/IP and Named Pipes are enabled in the 3 Protocol sections.

If they are disabled then enable them then check whether the remote connections are enabled using the SQL Server Management Studio by right clicking on the SQL Server (Parent node in the Object Explorer) and selecting properties.

Then go to the Connections and make sure that the Allow remote connections to this server checkbox is checked.

Then restart the SQL Server Service using the SQL Server Services section in the SQL Server Configuration Manager or by going to the machine services by Start –> Administrative Tools –> Services.

2. Check the SSRS Service Account.

Go to Start –> All Programs –> Microsoft SQL Server 200x –> Configuration Tools and open Reporting Services Configuration Manager. Then click on the Service Account section and verify its details. If you are not sure about the details it’s always good to re-enter them since there is nothing to loose.

3. Check the SSRS Database and Credentials.

Click the Database section and see whether all details are correct. This is very important since SSRS need to get connected to its SQL database to function properly. Pay good attention to validate the SQL Server Name, verify the database mentioned under Database Name exists in the specified SQL Server. If you are not sure of the existing settings just click on the Change Database button and it will open a wizard to step through.

If you already have reports in the SSRS then always try to Choose an existing report server database before Creating a new report server database since when you create a new database you will loose existing customizations you might have.

Then go to the bottom section to see the Credentials provided are correct. I am used to validate these by opening the management studio and trying to connect using the provided account. After validating the account using the management studio, to be in the safe side you can set those settings using the Change Credentials button.

4. Check your Firewall.

If the you have enabled a firewall such as Windows Firewall or a 3rd party firewall it might be blocking the functionalities required. Just try switching off the firewall, if that solves then try creating a rule for the firewall to authorize the required connections.

Hope this helps to correct the error, if not let me know some times I may be able to help.