Sql server 在SQL Server中,哪些数据类型不能包含在Insert语句中?

Sql server 在SQL Server中,哪些数据类型不能包含在Insert语句中?,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有一个insert语句,它将数据从一个数据库中的表复制到同一服务器上的另一个数据库 我需要动态生成查询,因为我不知道其他数据库中的表名。我知道,TIMESTAMP列不能包含在INSERT列表中,因为它会引发以下错误: 无法在时间戳列中插入显式值。在列列表中使用INSERT可排除timestamp列,或在timestamp列中插入默认值 我需要像这样知道SQLServer2008中有多少种数据类型。我可以在插入数据时排除这些数据类型 如果任何人有任何有用的信息,这将非常有用。简短回答 在我的计算

我有一个
insert
语句,它将数据从一个数据库中的表复制到同一服务器上的另一个数据库

我需要动态生成查询,因为我不知道其他数据库中的表名。我知道,
TIMESTAMP
列不能包含在
INSERT
列表中,因为它会引发以下错误:

无法在时间戳列中插入显式值。在列列表中使用INSERT可排除timestamp列,或在timestamp列中插入默认值

我需要像这样知道SQLServer2008中有多少种数据类型。我可以在插入数据时排除这些数据类型

如果任何人有任何有用的信息,这将非常有用。

简短回答 在我的计算机(SQL Server 2014)上,仅
时间戳
不允许插入到中

注意:还有
行版本
,它作为
时间戳
的同义词列出,但它没有出现在
系统类型中

显然,他们还有其他一些功能可能会阻止这一点(如评论中所述),例如
IDENTITY

长答案

以下是您自己检查的方法:

生成一个创建表脚本,该脚本将所有支持的类型作为一列:

SELECT 'CREATE TABLE #Types( ' + STUFF( 
( SELECT ', Type_' + name + ' ' + name
FROM sys.types
ORDER BY system_type_id
FOR XML PATH( '' )), 1, 1, '' ) + ' )'
您将得到如下结果:

CREATE TABLE #Types(  Type_image image, Type_text text, ..... )
生成insert和select语句:

SELECT 'INSERT INTO #Types( ' + STUFF( 
( SELECT ', Type_' + name
FROM sys.types
ORDER BY system_type_id
FOR XML PATH( '' )), 1, 1, '' ) + ' )'

SELECT 'SELECT ' + STUFF( 
( SELECT ', CONVERT( ' + name + ', '''' )'
FROM sys.types
ORDER BY system_type_id
FOR XML PATH( '' )), 1, 1, '' )
注意:对于
选择
我们利用了这样一个事实,即对于大多数类型,将空字符串转换为类型都会成功,例如''->转换(INT->0)

它不适用于所有类型,但它们很少,您可以在MSDN上搜索类型信息(例如)以获取示例值

在整理出默认值和SQL Server拒绝插入的排除类型后,您可以生成另一个表,例如
#Types2
,并从
#types
表中插入值

完整代码:

CREATE TABLE #Types(  Type_image image, Type_text text, Type_uniqueidentifier uniqueidentifier, Type_date date, Type_time time, Type_datetime2 datetime2, Type_datetimeoffset datetimeoffset, Type_tinyint tinyint, Type_smallint smallint, Type_int int, Type_smalldatetime smalldatetime, Type_real real, Type_money money, Type_datetime datetime, Type_float float, Type_sql_variant sql_variant, Type_ntext ntext, Type_bit bit, Type_decimal decimal, Type_numeric numeric, Type_smallmoney smallmoney, Type_bigint bigint, Type_varbinary varbinary, Type_varchar varchar, Type_binary binary, Type_char char, Type_timestamp timestamp, Type_nvarchar nvarchar, Type_sysname sysname, Type_nchar nchar, Type_hierarchyid hierarchyid, Type_geometry geometry, Type_geography geography, Type_xml xml )
INSERT INTO #Types(  Type_image, Type_text, Type_uniqueidentifier, Type_date, Type_time, Type_datetime2, Type_datetimeoffset, Type_tinyint, Type_smallint, Type_int, Type_smalldatetime, Type_real, Type_money, Type_datetime, Type_float, Type_sql_variant, Type_ntext, Type_bit, Type_decimal, Type_numeric, Type_smallmoney, Type_bigint, Type_varbinary, Type_varchar, Type_binary, Type_char, Type_nvarchar, Type_sysname, Type_nchar, Type_hierarchyid, Type_geometry, Type_geography, Type_xml )
SELECT  CONVERT( image, '' ), CONVERT( text, '' ), CONVERT( uniqueidentifier, '0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong' ), CONVERT( date, '' ), CONVERT( time, '' ), CONVERT( datetime2, '' ), CONVERT( datetimeoffset, '' ), CONVERT( tinyint, '' ), CONVERT( smallint, '' ), CONVERT( int, '' ), CONVERT( smalldatetime, '' ), CONVERT( real, '' ), CONVERT( money, '' ), CONVERT( datetime, '' ), CONVERT( float, '' ), CONVERT( sql_variant, '' ), CONVERT( ntext, '' ), CONVERT( bit, '' ), CONVERT( decimal, '0' ), CONVERT( numeric, '0' ), CONVERT( smallmoney, '' ), CONVERT( bigint, '' ), CONVERT( varbinary, '' ), CONVERT( varchar, '' ), CONVERT( binary, '' ), CONVERT( char, '' ), CONVERT( nvarchar, '' ), CONVERT( sysname, '' ), CONVERT( nchar, '' ), CONVERT( hierarchyid, '/1/3/' ), geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0 ), geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656 )', 4326), CONVERT( xml, '' )

CREATE TABLE #Types2(  Type_image image, Type_text text, Type_uniqueidentifier uniqueidentifier, Type_date date, Type_time time, Type_datetime2 datetime2, Type_datetimeoffset datetimeoffset, Type_tinyint tinyint, Type_smallint smallint, Type_int int, Type_smalldatetime smalldatetime, Type_real real, Type_money money, Type_datetime datetime, Type_float float, Type_sql_variant sql_variant, Type_ntext ntext, Type_bit bit, Type_decimal decimal, Type_numeric numeric, Type_smallmoney smallmoney, Type_bigint bigint, Type_varbinary varbinary, Type_varchar varchar, Type_binary binary, Type_char char, Type_nvarchar nvarchar, Type_sysname sysname, Type_nchar nchar, Type_hierarchyid hierarchyid, Type_geometry geometry, Type_geography geography, Type_xml xml )

INSERT INTO #Types2(  Type_image, Type_text, Type_uniqueidentifier, Type_date, Type_time, Type_datetime2, Type_datetimeoffset, Type_tinyint, Type_smallint, Type_int, Type_smalldatetime, Type_real, Type_money, Type_datetime, Type_float, Type_sql_variant, Type_ntext, Type_bit, Type_decimal, Type_numeric, Type_smallmoney, Type_bigint, Type_varbinary, Type_varchar, Type_binary, Type_char, Type_nvarchar, Type_sysname, Type_nchar, Type_hierarchyid, Type_geometry, Type_geography, Type_xml )
SELECT Type_image, Type_text, Type_uniqueidentifier, Type_date, Type_time, Type_datetime2, Type_datetimeoffset, Type_tinyint, Type_smallint, Type_int, Type_smalldatetime, Type_real, Type_money, Type_datetime, Type_float, Type_sql_variant, Type_ntext, Type_bit, Type_decimal, Type_numeric, Type_smallmoney, Type_bigint, Type_varbinary, Type_varchar, Type_binary, Type_char, Type_nvarchar, Type_sysname, Type_nchar, Type_hierarchyid, Type_geometry, Type_geography, Type_xml
FROM #Types

除非identity\u insert设置为on,否则也不能插入到标识列中,但identity不是数据类型而是属性,identity的数据类型可以是tinyint、smallint、int、bigint、decimal(p,0)或numeric(p,0)。我假设只有时间戳有此限制。感谢您指出这一点:)