---
title: "sp_describe_cursor_columns (Transact-SQL) | Microsoft Docs"
ms.custom: ""
ms.date: "03/16/2017"
ms.prod: sql
ms.prod_service: "database-engine"
ms.reviewer: ""
ms.technology: system-objects
ms.topic: "language-reference"
f1_keywords:
- "sp_describe_cursor_columns"
- "sp_describe_cursor_columns_TSQL"
dev_langs:
- "TSQL"
helpviewer_keywords:
- "sp_describe_cursor_columns"
ms.assetid: 6eaa54af-7ba4-4fce-bf6c-6ac67cc1ac94
author: stevestein
ms.author: sstein
---
# sp_describe_cursor_columns (Transact-SQL)
[!INCLUDE[tsql-appliesto-ss2008-xxxx-xxxx-xxx-md](../../includes/tsql-appliesto-ss2008-xxxx-xxxx-xxx-md.md)]
Reports the attributes of the columns in the result set of a server cursor.
 [Transact-SQL Syntax Conventions](../../t-sql/language-elements/transact-sql-syntax-conventions-transact-sql.md)
## Syntax
```
sp_describe_cursor_columns
[ @cursor_return = ] output_cursor_variable OUTPUT
{ [ , [ @cursor_source = ] N'local' ,
[ @cursor_identity = ] N'local_cursor_name' ]
| [ , [ @cursor_source = ] N'global' ,
[ @cursor_identity = ] N'global_cursor_name' ]
| [ , [ @cursor_source = ] N'variable' ,
[ @cursor_identity = ] N'input_cursor_variable' ]
}
```
## Arguments
[ @cursor_return= ] *output_cursor_variable* OUTPUT
Is the name of a declared cursor variable to receive the cursor output. *output_cursor_variable* is **cursor**, with no default, and must not be associated with any cursors at the time sp_describe_cursor_columns is called. The cursor returned is a scrollable, dynamic, read-only cursor.
[ @cursor_source= ] { N'local' | N'global' | N'variable' }
Specifies whether the cursor being reported on is specified by using the name of a local cursor, a global cursor, or a cursor variable. The parameter is **nvarchar(30)**.
[ @cursor_identity= ] N'*local_cursor_name*'
Is the name of a cursor created by a DECLARE CURSOR statement that either has the LOCAL keyword or that defaulted to LOCAL. *local_cursor_name* is **nvarchar(128)**.
[ @cursor_identity= ] N'*global_cursor_name*'
Is the name of a cursor created by a DECLARE CURSOR statement that either has the GLOBAL keyword or that defaulted to GLOBAL. *global_cursor_name* is **nvarchar(128)**.
*global_cursor_name* can also be the name of an API server cursor that is opened by an ODBC application and then named by calling SQLSetCursorName.
[ @cursor_identity= ] N'*input_cursor_variable*'
Is the name of a cursor variable associated with an open cursor. *input_cursor_variable* is **nvarchar(128)**.
## Return Code Values
None
## Cursors Returned
sp_describe_cursor_columns encapsulates its report as a [!INCLUDE[tsql](../../includes/tsql-md.md)] **cursor** output parameter. This enables [!INCLUDE[tsql](../../includes/tsql-md.md)] batches, stored procedures, and triggers to work with the output one row at a time. This also means that the procedure cannot be called directly from database API functions. The **cursor** output parameter must be bound to a program variable, but the database APIs do not support binding **cursor** parameters or variables.
The following table shows the format of the cursor returned by using sp_describe_cursor_columns.
|Column name|Data type|Description|
|-----------------|---------------|-----------------|
|column_name|**sysname** (nullable)|Name assigned to the result set column. The column is NULL if the column was specified without an accompanying AS clause.|
|ordinal_position|**int**|Relative position of the column from the leftmost column in the result set. The first column is in position 0.|
|column_characteristics_flags|**int**|A bitmask that indicates the information stored in DBCOLUMNFLAGS in OLE DB. Can be one or a combination of the following:
1 = Bookmark
2 = Fixed length
4 = Nullable
8 = Row versioning
16 = Updatable column (set for projected columns of a cursor that has no FOR UPDATE clause and, if there is such a column, can be only one per cursor).
When bit values are combined, the characteristics of the combined bit values apply. For example, if the bit value is 6, the column is a fixed-length (2), nullable (4) column.|
|column_size|**int**|Maximum possible size for a value in this column.|
|data_type_sql|**smallint**|Number that indicates the [!INCLUDE[ssNoVersion](../../includes/ssnoversion-md.md)] data type of the column.|
|column_precision|**tinyint**|Maximum precision of the column as per the *bPrecision* value in OLE DB.|
|column_scale|**tinyint**|Number of digits to the right of the decimal point for the **numeric** or **decimal** data types as per the *bScale* value in OLE DB.|
|order_position|**int**|If the column participates in the ordering of the result set, the position of the column in the order key relative to the leftmost column.|
|order_direction|**varchar(1)**(nullable)|A = The column is in the order key and the ordering is ascending.
D = The column is in the order key and the ordering is descending.
NULL = The column does not participate in ordering.|
|hidden_column|**smallint**|0 = this column appears in the select list.
1 = Reserved for future use.|
|columnid|**int**|Column ID of the base column. If the result set column was built from an expression, columnid is -1.|
|objectid|**int**|Object ID of the object or base table that is supplying the column. If the result set column was built from an expression, objectid is -1.|
|dbid|**int**|ID of the database that contains the base table that is supplying the column. If the result set column was built from an expression, dbid is -1.|
|dbname|**sysname**
(nullable)|Name of the database that contains the base table that is supplying the column. If the result set column was built from an expression, dbname is NULL.|
## Remarks
sp_describe_cursor_columns describes the attributes of the columns in the result set of a server cursor, such as the name and data type of each cursor. Use sp_describe_cursor for a description of the global attributes of the server cursor. Use sp_describe_cursor_tables for a report of the base tables referenced by the cursor. To obtain a report of the [!INCLUDE[tsql](../../includes/tsql-md.md)] server cursors visible on the connection, use sp_cursor_list.
## Permissions
Requires membership in the public role.
## Examples
The following example opens a global cursor and uses `sp_describe_cursor_columns` to report on the columns used in the cursor.
```
USE AdventureWorks2012;
GO
-- Declare and open a global cursor.
DECLARE abc CURSOR KEYSET FOR
SELECT LastName
FROM Person.Person;
GO
OPEN abc;
-- Declare a cursor variable to hold the cursor output variable
-- from sp_describe_cursor_columns.
DECLARE @Report CURSOR;
-- Execute sp_describe_cursor_columns into the cursor variable.
EXEC master.dbo.sp_describe_cursor_columns
@cursor_return = @Report OUTPUT
,@cursor_source = N'global'
,@cursor_identity = N'abc';
-- Fetch all the rows from the sp_describe_cursor_columns output cursor.
FETCH NEXT from @Report;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
FETCH NEXT from @Report;
END
-- Close and deallocate the cursor from sp_describe_cursor_columns.
CLOSE @Report;
DEALLOCATE @Report;
GO
-- Close and deallocate the original cursor.
CLOSE abc;
DEALLOCATE abc;
GO
```
## See Also
[Cursors](../../relational-databases/cursors.md)
[CURSOR_STATUS (Transact-SQL)](../../t-sql/functions/cursor-status-transact-sql.md)
[DECLARE CURSOR (Transact-SQL)](../../t-sql/language-elements/declare-cursor-transact-sql.md)
[sp_describe_cursor (Transact-SQL)](../../relational-databases/system-stored-procedures/sp-describe-cursor-transact-sql.md)
[sp_cursor_list (Transact-SQL)](../../relational-databases/system-stored-procedures/sp-cursor-list-transact-sql.md)
[sp_describe_cursor_tables (Transact-SQL)](../../relational-databases/system-stored-procedures/sp-describe-cursor-tables-transact-sql.md)
[System Stored Procedures (Transact-SQL)](../../relational-databases/system-stored-procedures/system-stored-procedures-transact-sql.md)