繁体   English   中英

SQL Server:从字符串转换日期和/或时间时转换失败

[英]SQL Server: Conversion failed when converting date and/or time from character string

我想检查表的列是否包含空值,如果是,则分配0值。 我有问题,因为那里存在UniqueIdentifier列。 因此,我更改代码以分配“ 0”值。 但是现在有DateTime列时我遇到了问题。 这是代码:

Select @sql = @sql + 'Case when IsNull(i.[' + Column_Name +  
'],''0'') = IsNull(d.[' + Column_name + '],''0'') then ''''  
 else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +' 
from information_schema.columns  
where table_name = 'Users' and column_name <>'rowguid' and column_name <>'modifieddate'

另一个失败的尝试:

Select @sql = @sql + 
    'Case 
        when IsDate(i.['+Column_Name+']) =1 and IsDate(d.['+Column_Name+']) =1  and IsNull(i.[' + Column_Name +  '],1/1/1900) = IsNull(d.[' + Column_name + '],1/1/1900)
        then ''''
        when IsNull(i.[' + Column_Name +  '],''0'') = IsNull(d.[' + Column_name + '],''0'') 
        then ''''  
        else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +' 
from information_schema.columns  
where table_name = 'Users' and column_name <>'rowguid' and column_name <>'modifieddate'

完整代码:

if @Action = 'U'
BEGIN
Select @sql = @sql + 
    'Case when IsNull(i.[' + Column_Name +  
'],' + CASE DATA_TYPE
         WHEN 'int' THEN '0'
         WHEN 'bigint' THEN '0'
         WHEN 'tinyint' THEN '0'
         WHEN 'uniqueidentifier' THEN '''0'''
         WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'date' THEN CHAR(39) + '1/1/1900' + CHAR(39)
         WHEN 'datetime' THEN CHAR(39) + '1/1/1900 00:00:00' + CHAR(39)
         ELSE ''
       END + ') = IsNull(d.[' + Column_name + '],'+
       CASE DATA_TYPE
         WHEN 'int' THEN '0'
         WHEN 'bigint' THEN '0'
         WHEN 'tinyint' THEN '0'
         WHEN 'uniqueidentifier' THEN '''0'''
         WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'date' THEN CHAR(39) + '1/1/1900' + CHAR(39)
         WHEN 'datetime' THEN CHAR(39) + '1/1/1900 00:00:00' + CHAR(39)
         ELSE ''
       END + ') then ''''  
 else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +'
from information_schema.columns  
where table_name = 'Users' and column_name <>'rowguid' and column_name <>'modifieddate'
--Define output parameter 
set @ParmDefinition = '@OutString varchar(max) OUTPUT' 
--Format sql 
set @sql = 'Select @OutString = '  
+ Substring(@sql,1 , len(@sql) -1) +  
' From dbo.Users i  ' --Will need to be updated for target schema 
+ ' inner join #tempTrigT d on 
i.id = d.id'  --Will need to be updated for target schema 
--Execute sql and retrieve desired column list in output parameter 
exec sp_executesql @sql, @ParmDefinition, @OutString OUT 

下面是一个示例,相应的CASE可能看起来像-但是,它还不完整,您可能需要对其进行扩展/重新设计:

Select @sql = @sql + 'Case when IsNull(i.[' + Column_Name +  
'],' + CASE DATA_TYPE
         WHEN 'int' THEN '0'
         WHEN 'bigint' THEN '0'
         WHEN 'tinyint' THEN '0'
         WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'date' THEN CHAR(39) + '1900-01-01' + CHAR(39)
         ELSE ''
       END + ') = IsNull(d.[' + Column_name + '],'+
       CASE DATA_TYPE
         WHEN 'int' THEN '0'
         WHEN 'bigint' THEN '0'
         WHEN 'tinyint' THEN '0'
         WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'date' THEN CHAR(39) + '1900-01-01' + CHAR(39)
         ELSE ''
       END + ') then ''''  
 else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +'
 from information_schema.columns  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM