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)。我假设只有时间戳有此限制。感谢您指出这一点:)