sp_special_columns (Transact-SQL)

Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance

Returns the optimal set of columns that uniquely identify a row in the table. Also returns columns automatically updated when any value in the row is updated by a transaction.

Transact-SQL syntax conventions

Syntax

sp_special_columns
    [ @table_name = ] N'table_name'
    [ , [ @table_owner = ] N'table_owner' ]
    [ , [ @table_qualifier = ] N'table_qualifier' ]
    [ , [ @col_type = ] 'col_type' ]
    [ , [ @scope = ] 'scope' ]
    [ , [ @nullable = ] 'nullable' ]
    [ , [ @ODBCVer = ] ODBCVer ]
[ ; ]

Arguments

[ @table_name = ] N'table_name'

The name of the table used to return catalog information. @table_name is sysname, with no default. Wildcard pattern matching isn't supported.

[ @table_owner = ] N'table_owner'

The table owner of the table used to return catalog information. @table_owner is sysname, with a default of NULL. Wildcard pattern matching isn't supported. If @table_owner isn't specified, the default table visibility rules of the underlying database management system (DBMS) apply.

In SQL Server, if the current user owns a table with the specified name, the columns of that table are returned. If @table_owner isn't specified, and the current user doesn't own a table of the specified @table_name, this procedure looks for a table of the specified @table_name owned by the database owner. If the table exists, its columns are returned.

[ @table_qualifier = ] N'table_qualifier'

The name of the table qualifier. @table_qualifier is sysname, with a default of NULL. Various DBMS products support three-part naming for tables (<qualifier>.<owner>.<name>). In SQL Server, this column represents the database name. In some products, it represents the server name of the database environment of the table.

[ @col_type = ] 'col_type'

The column type. @col_type is char(1), with a default of R.

  • Type R returns the optimal column or set of columns that, by retrieving values from the column or columns, allows for any row in the specified table to be uniquely identified. A column can be either a pseudocolumn designed for this purpose, or the column or columns of any unique index for the table.

  • Type V returns the column or columns in the specified table, if any, that are automatically updated by the data source when any value in the row is updated by any transaction.

[ @scope = ] 'scope'

The minimum required scope of the ROWID. @scope is char(1), with a default of T.

  • Scope C specifies that the ROWID is valid only when positioned on that row.
  • Scope T specifies that the ROWID is valid for the transaction.

[ @nullable = ] 'nullable'

Specifies whether the special columns can accept a NULL value. @nullable is char(1), with a default of U.

  • O specifies special columns that don't allow null values.
  • U specifies columns that are partially nullable.

[ @ODBCVer = ] ODBCVer

The ODBC version being used. @ODBCVer is int, with a default of 2. This value indicates ODBC version 2.0. For more information about the difference between ODBC version 2.0 and ODBC version 3.0, see the ODBC SQLSpecialColumns specification for ODBC version 3.0.

Return code values

None.

Result set

Column name Data type Description
SCOPE smallint Actual scope of the row ID. Can be 0, 1, or 2. SQL Server always returns 0. This field always returns a value.

0 = SQL_SCOPE_CURROW. The row ID is guaranteed to be valid only while positioned on that row. A later reselect using the row ID might not return a row if the row was updated or deleted by another transaction.
1 = SQL_SCOPE_TRANSACTION. The row ID is guaranteed to be valid for the duration of the current transaction.
2 = SQL_SCOPE_SESSION. The row ID is guaranteed to be valid for the duration of the session (across transaction boundaries).
COLUMN_NAME sysname Column name for each column of the @table_name returned. This field always returns a value.
DATA_TYPE smallint ODBC SQL data type.
TYPE_NAME sysname Data source-dependent data type name; for example, char, varchar, money, or text.
PRECISION int Precision of the column on the data source. This field always returns a value.
LENGTH int Length, in bytes, required for the data type in its binary form in the data source, for example, 10 for char(10), 4 for integer, and 2 for smallint.
SCALE smallint Scale of the column on the data source. NULL is returned for data types for which scale isn't applicable.
PSEUDO_COLUMN smallint Indicates whether the column is a pseudocolumn. SQL Server always returns 1:

0 = SQL_PC_UNKNOWN
1 = SQL_PC_NOT_PSEUDO
2 = SQL_PC_PSEUDO

Remarks

sp_special_columns is equivalent to SQLSpecialColumns in ODBC. The results returned are ordered by SCOPE.

Permissions

Requires SELECT permission on the schema.

Examples

The following example returns information about the column that uniquely identifies rows in the HumanResources.Department table.

USE AdventureWorks2022;
GO

EXEC sp_special_columns @table_name = 'Department',
    @table_owner = 'HumanResources';