2017-09-05 24 views
1

テーブルの列にNULL値が含まれているかどうかをチェックし、0値を割り当てる場合はチェックします。私はどこにUniqueIdentifier列が存在するので問題があった。だから私は '0'の値を割り当てるために私のコードを変更します。しかし、今私はDateTime列があるときに問題があります。ここ は、コードは次のとおりです。SQL Server:文字列から日付および/または時刻を変換するときに変換が失敗しました

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 
+0

より適切なデフォルト値、つまり日付を選択する必要があります。 –

+0

異なる列(int、datetime、GUIDなど)があるため、動的になりたい – aggicd

+0

データベースが許可するものは、必要なものよりも関連性があります。 –

答えて

2

対応するケースが-howeverように見えるかもしれない方法の例を、それはありませんあなたは少し拡張/再設計したいかもしれません:

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 
+0

私はそのdatetimeとnullの場合にチェックしたいと思います。私の編集した質問を参照してください – aggicd

+0

それでは、WHEN 'datetime'を追加してCHAR(39)+ '1900-01-01 00:00:00' + CHAR(39)を入力してください。 – Tyron78

+0

はOKですが、トリガーが発生するとこのエラーが発生します:Incorect syntax near ')' – aggicd

関連する問題