Skip Navigation Links
Home
Articles
SQL Server 2012
SQL Server 2014
SQL Server 2016
FAQ
Practice Test
Tip of the Day : How to Call GETDATE Function in a User-Defined Function
FAQ - SQL Server

FAQ - SQL Server 2005
Home > Frequently Asked Questions > SQL Server Error Messages
SQL Server Error Messages - Frequently Asked Questions

 31.  The text, ntext, and image data types are invalid for local variables.

Error Message:

Server: Msg 2739, Level 16, State 1, Line 1
The text, ntext, and image data types are invalid for local variables.

Causes:

As the message suggests, you cannot create local variables of text, ntext or image data types.  The following simple line of code will easily reproduce the error:

View Error Message Details and Solution / Workaround

Solution/Workaround:

If you are using SQL Server 2005, you can use the varchar(max), nvarchar(max) and varbinary(max) in place of the text, ntext and image data types, respectively.  With varchar(max), nvarchar(max) and varbinary(max), you can create local variables of these data types and manipulate them just like any varchar, nvarchar and varbinary data type.

If you are using SQL Server 2000, a work around is to use VARCHAR(8000) or NVARCHAR(4000) as the data type of the local variable. Then you have to CAST the value of the TEXT into these data types.  The disadvantage of using VARCHAR(8000) or NVARCHAR(4000) is that you are limited in the length, as specified in the length.

Here’s an example on how to use NVARCHAR in place of the NTEXT data type:

DECLARE @CategoryDescription  NVARCHAR(4000)

SELECT @CategoryDescription = CAST([Description] AS NVARCHAR(4000))
FROM [dbo].[Categories]
WHERE [CategoryID] = 1

A second option is to make use of multiple VARCHAR(8000) or NVARCHAR(4000) local variables then concatenate them as needed.  One common task when using local variables with more than 8000 characters is when building and executing long dynamic SQL statements.  This limitation can easily be overcome by making use of multiple VARCHAR(8000) or NVARCHAR(4000) local variables and then concatenating them when they are about to be executed:

DECLARE @SQLStmt1    VARCHAR(8000)
DECLARE @SQLStmt2    VARCHAR(8000)
DECLARE @SQLStmt3    VARCHAR(8000)

-- Build your SQL statements using these variables

EXECUTE (@SQLStmt1 + @SQLStmt2 + @SQLStmt3)

A third option is to use the READTEXT, WRITETEXT and UPDATETEXT Transact-SQL statements together with the TEXTPTR function to manipulate text, ntext and image columns in a table.  You can refer to Books Online regarding these Transact-SQL statements and functions for more information.


 32.  All the queries in a query expression containing a UNION operator must have the same number of expressions in their select lists.

Error Message:

Server: Msg 8157, Level 16, State 1, Procedure View Name, Line 3
All the queries in a query expression containing a UNION operator 
must have the same number of expressions in their select lists.

Causes:

This error occurs when creating a view wherein the view uses the UNION or UNION ALL operator and the number of columns specified in the SELECT clause on the tables are not the same.

View Error Message Details and Solution / Workaround

To illustrate, let’s say you have the following table definitions for the company employees, past and present:

CREATE TABLE [dbo].[Employees] (
    [EmployeeID]            INT,
    [FirstName]             VARCHAR(50),
    [LastName]              VARCHAR(50),
    [Position]              VARCHAR(50)
)

CREATE TABLE [dbo].[OldEmployees] (
    [EmployeeID]            INT,
    [FirstName]             VARCHAR(50),
    [LastName]              VARCHAR(50),
    [Position]              VARCHAR(50),
    [LastEmploymentDate]    DATETIME
)

Then you decided to create a view on these two tables that will contain all employees of the company:

CREATE VIEW [dbo].[AllEmployees]
AS
SELECT * FROM [dbo].[Employees]
UNION ALL
SELECT * FROM [dbo].[OldEmployees]

Since the [dbo].[OldEmployees] table has an extra column for the last employment date of the employee, [LastEmploymentDate], the following error is encountered:

Server: Msg 8157, Level 16, State 1, Procedure AllEmployees, Line 3
All the queries in a query expression containing a UNION operator 
must have the same number of expressions in their select lists.

Solution/Workaround:

When creating a view that merges or joins the results of two tables that do not have the same number of columns, always specify the columns in the SELECT clause instead of using the SELECT *.  Also, use fillers for the missing columns from each table.  If the missing column is of VARCHAR data type, you can use NULL or an empty string as filler for the missing column.  If the missing column is a numeric column, you can use either NULL or 0 for the missing column.

To avoid the error generated from the above example, the script for the view will look like the following:

CREATE VIEW [dbo].[AllEmployees]
AS
SELECT [EmployeeID], [FirstName], [LastName],
       [Position], NULL AS [LastEmploymentDate]
FROM [dbo].[Employees]
UNION ALL
SELECT [EmployeeID], [FirstName], [LastName],
       [Position], [LastEmploymentDate]
FROM [dbo].[OldEmployees]

Since the [dbo].[Employees] table does not have the [LastEmploymentDate] column, a NULL value is returned for that column so that the number of columns in the first table matches the number of columns in the second column.


 33.  Invalid use of 'INSERT' within a function.

Error Message:

Server: Msg 443, Level 16, State 2, Procedure CreateNew, Line 5
Invalid use of 'INSERT' within a function.

Causes:

This error is encountered when you use the INSERT command inside a user-defined function and the target table is not a table variable local to the function.  The INSERT command is only allowed when modifying table variables local to the function.

View Error Message Details and Solution / Workaround

To illustrate, here’s a user-defined function that will generate the error:

CREATE FUNCTION [dbo].[CreateNewRow] 
( @pFirstName VARCHAR(50), @pLastName VARCHAR(50) )
RETURNS INT
AS
BEGIN

    INSERT INTO [dbo].[Student] ( [FirstName], [LastName] )
    VALUES ( @pFirstName, @pLastName )

    RETURN SCOPE_IDENTITY()
END
GO
Server: Msg 443, Level 16, State 2, Procedure CreateNewRow, Line 7
Invalid use of 'INSERT' within a function.

Here’s a user-defined function that uses the INSERT command but the modified table is a table variable local to the function:

CREATE FUNCTION [dbo].[ufn_GetMaxValue]
( @pInt1 INT, @pInt2 INT, @pInt3 INT, @pInt4 INT )
RETURNS INT
AS
BEGIN
    DECLARE @IntTable TABLE ( [IntValue] INT )
    DECLARE @MaxValue INT

    INSERT INTO @IntTable ( [IntValue] ) VALUES ( @pInt1 )
    INSERT INTO @IntTable ( [IntValue] ) VALUES ( @pInt2 )
    INSERT INTO @IntTable ( [IntValue] ) VALUES ( @pInt3 )
    INSERT INTO @IntTable ( [IntValue] ) VALUES ( @pInt4 )

    SELECT @MaxValue = MAX( [IntValue] )
    FROM @IntTable

    RETURN @MaxValue
END
GO

This user-defined function also uses the INSERT command but since it is inserting into a local variable, then the error is not encountered.

Solution/Workaround:

Since the INSERT command is not allowed in a user-defined function, you have to use a stored procedure for this purpose instead.  Here’s the same script as the above function but using a stored procedure:

CREATE PROCEDURE [dbo].[CreateNewRow]
    @pFirstName VARCHAR(50), 
    @pLastName VARCHAR(50)
AS

INSERT INTO [dbo].[Student] ( [FirstName], [LastName] )
VALUES ( @pFirstName, @pLastName )

RETURN SCOPE_IDENTITY()
GO

 34.  Cannot define PRIMARY KEY constraint on nullable column in table 'Table Name'.  Could not create constraint. See previous errors.

Error Message:

Server: Msg 8111, Level 16, State 1, Line 1
Cannot define PRIMARY KEY constraint on nullable column in table 'Table Name'.
Server: Msg 1750, Level 16, State 1, Line 1
Could not create constraint. See previous errors.

Causes:

This error is encountered when adding a PRIMARY KEY constraint on a table where the column being designated as the PRIMARY KEY is defined as NULLABLE.

View Error Message Details and Solution / Workaround

To illustrate, let’s assume that you have the following table definition:

CREATE TABLE [dbo].[Currency] (
    [Code]   CHAR(3),
    [Name]   VARCHAR(50)
)

Since the nullability of the columns is not specified, this is determined by the session settings ANSI_NULL_DFLT_ON and ANSI_NULL_DFLT_OFF or by the database settings ANSI null default.  If the ANSI_NULL_DFLT_ON session setting is ON or the ANSI null default is set to true, then the nullability of the column will be set to NULL.

Assuming that this is the case, wherein the nullability of both the Code and Name columns are set to NULL, creating a PRIMARY KEY constraint on the Code column generates the error:

ALTER TABLE [dbo].[Currency]
ADD CONSTRAINT PK_Currency_Code 
PRIMARY KEY ( [Code] )
Server: Msg 8111, Level 16, State 1, Line 1
Cannot define PRIMARY KEY constraint on nullable column in table 'Currency'.
Server: Msg 1750, Level 16, State 1, Line 1
Could not create constraint. See previous errors.

Solution/Workaround:

To avoid this error from happening, first change the nullability of the columns being designated as the primary key columns to NOT NULL then create the PRIMARY KEY constraint:

ALTER TABLE [dbo].[Currency]
ALTER COLUMN [Code] CHAR(3) NOT NULL
GO

ALTER TABLE [dbo].[Currency]
ADD CONSTRAINT PK_Currency_Code 
PRIMARY KEY ( [Code] )
GO

 35.  The data type int is invalid for the substring function.  Allowed types are: char/varchar, nchar/nvarchar, and binary/varbinary.

Error Message:

Server: Msg 256, Level 16, State 1, Line 3
The data type int is invalid for the substring function.
Allowed types are: char/varchar, nchar/nvarchar, and binary/varbinary.

Causes:

As the message suggests, this error occurs when using the SUBSTRING string function and the data type of the first parameter is INT.

View Error Message Details and Solution / Workaround

Error Message:

To illustrate, the following script will generate the error:

DECLARE @YYYYMMDD  INT
SET @YYYYMMDD = 20060101
SELECT SUBSTRING(@YYYYMMDD, 1, 4) AS [Year]

Solution/Workaround:

To avoid this error, always make sure that the data type of the first parameter that is passed to the SUBSTRING function is of char, varchar, nchar, nvarchar, binary or varbinary data type.  If the data type is not any of these, you can use the CAST function to convert it to one of these data types.

DECLARE @YYYYMMDD  INT
SET @YYYYMMDD = 20060101
SELECT SUBSTRING(CAST(@YYYYMMDD AS VARCHAR(8)), 1, 4) AS [Year]
More Frequently Asked Questions - SQL Server Error Messages Previous Page  Next Page  
Related Articles :