xs:dateTime 型、xs:date 型、および xs:time 型のストレージ形式の変更Changes to the storage format for types xs:dateTime, xs:date, and xs:time

XMLDATETIME ルールでは、SQL Server 2014SQL Server 2014 へのアップグレード後に無効になる型指定された XML データがデータベースに含まれているかどうかが確認されます。The XMLDATETIME rule identifies whether or not your databases contain typed XML data that will become invalid after upgrading to SQL Server 2014SQL Server 2014.

コンポーネントComponent

データベース エンジンDatabase Engine

説明Description

ストレージ形式SQL Server 2014SQL Server 2014型 xs:dateTime、xs:date 型、および xs:time が変更された値のタイム ゾーン情報の有無をサポートし、タイム ゾーンの保存を許可します。The storage format in SQL Server 2014SQL Server 2014 for types xs:dateTime, xs:date, and xs:time has been changed to support values with or without time zone information and to allow for preservation of the time zone.

XML スキーマ コレクションがこのいずれかの型を参照している場合は、コレクションに関連付けられているすべての列の XML インデックスが、SQL Server 2014SQL Server 2014 へのアップグレード後に無効になります。If an XML Schema Collection references one of those types, XML indexes on all columns that are associated with the collection will be disabled after upgrade to SQL Server 2014SQL Server 2014. これらの型に対しては、SELECT または XQUERIES (またはその両方) を使用してクエリを実行できますが、XML インデックスは使用されません。You will be able to query them by using SELECT and/or XQUERIES, but the XML index will not be used. 負の年の値が検出された場合は、実行時エラーが発生します。If a negative year value is encountered, a runtime error will result.

また、SQL Server 2014SQL Server 2014 では負の年の値がサポートされません。Additionally, SQL Server 2014SQL Server 2014 does not support values with negative years.

XMLDATETIME ルールでは、影響を受ける型のいずれかを参照している XML スキーマ コレクションがあるかどうか、およびそのようなコレクションによって型指定された XML 列が存在するかどうかがチェックされます。The XMLDATETIME rule checks if any of your XML Schema Collections reference one of the affected types and if there are any XML columns typed by such collections.

修正措置Corrective Action

xs:date、xs:time、または xs:dateTime を参照するスキーマ コレクションに従って型指定された XML 列が存在することが XMLDATETIME ルールによって確認された場合は、データ内に負の年の値があるかどうかをまず見つけ出す必要があります。If the XMLDATETIME rule confirms that you have XML columns typed according to a schema collection that references xs:date, xs:time or xs:dateTime, you must first find out whether or not there are any values with negative years in your data. このような値があると、アップグレード後に XML インデックスを再構築できません。The presence of such values would prevent you from rebuilding your XML indexes after upgrading.

次に示すクエリでは、影響を受ける型を参照する XML スキーマ コレクション、および型指定された個々の XML 列を検索します。The following query will search for XML schema collections that reference the affected types and for each typed XML column. これにより、負の年を値に持つインスタンスが存在するかどうかがわかります。This will tell you whether or not there are instances with negative year values.

CREATE PROCEDURE DateTimeInvestigation(@withdata bit)  
-- @withdata = 0: only get the affected meta data information  
-- @withdata = 1: get the affected meta data and instance information  
AS  
BEGIN  
-- First get XML containing all schema collections containing affected element and attributes  
-- components (model groups?)   
-- and columns that are affected by the schema collections.   
CREATE table #_dt_collector(x xml);   
;with dttypes as  
  (SELECT * FROM sys.xml_schema_components   
   where base_xml_component_id IN   
      (SELECT xml_component_id   
       FROM sys.xml_schema_types   
       where (name='dateTime' or name='date') and kind='P'  
      )   
   union all  
   SELECT * FROM sys.xml_schema_components  
   where xml_component_id IN   
      (SELECT xml_component_id   
       FROM sys.xml_schema_types   
       where (name='dateTime' or name='date') and kind='P'  
       or kind='N' or kind='Z')   
   ),   
dtplaced as  
  (SELECT scp.*   
   FROM sys.xml_schema_component_placements scp   
   JOIN dttypes on scp.placed_xml_component_id=dttypes.xml_component_id  
  )   
insert into #_dt_collector SELECT x FROM (SELECT  
  xsc.xml_collection_id as "@collid"  
, s.name as "@schema"  
, xscol.name as "@name"  
, count(xsc.xml_component_id) as "@affected_elems_and_attrs"  
, (SELECT S.Name as "@schema", T.Name as "@table"  
        , C.Name as "@column"   
   FROM sys.columns C   
   JOIN sys.tables T ON C.object_id = T.object_id  
   JOIN sys.schemas S ON S.schema_id = T.schema_id  
   WHERE C.xml_collection_id = xsc.xml_collection_id  
   FOR XML PATH('Columns'), TYPE  
  )   
FROM sys.xml_schema_components xsc  
JOIN dtplaced on xsc.xml_component_id=dtplaced.xml_component_id  
JOIN sys.xml_schema_collections xscol on xsc.xml_collection_id =xscol.xml_collection_id  
JOIN sys.schemas s on xscol.schema_id=s.schema_id  
group by xsc.xml_collection_id, s.name, xscol.name  
FOR XML PATH('XML_Schema_Collections'), TYPE) as T(x);   
if (@withdata = 0)    
  BEGIN  
  SELECT x as "*" FROM #_dt_collector for xml path(''), root('data');   
  drop table #_dt_collector;   
  return;   
  END;   
-- Declare cursor to find all columns bound to the schema collections  
DECLARE C CURSOR FOR  
SELECT S.Name, T.Name, C.Name   
FROM sys.columns C   
JOIN sys.tables T ON C.object_id = T.object_id  
JOIN sys.schemas S ON S.schema_id = T.schema_id  
WHERE C.xml_collection_id  
IN (SELECT distinct xsc.xml_collection_id  
    FROM sys.xml_schema_components xsc  
    JOIN (SELECT scp.*   
          FROM sys.xml_schema_component_placements scp   
          JOIN (SELECT * FROM sys.xml_schema_components   
                where base_xml_component_id    
                in (SELECT xml_component_id   
                    FROM sys.xml_schema_types   
                    where (name='dateTime' or name='date') and kind='P'  
                   )   
                union all  
                SELECT * FROM sys.xml_schema_components  
                where xml_component_id   
                in (SELECT xml_component_id   
                    FROM sys.xml_schema_types   
                    where (name='dateTime' or name='date') and kind='P'  
                    or kind='N' or kind='Z')   
               ) dttypes on scp.placed_xml_component_id=dttypes.xml_component_id  
          ) dtplaced on xsc.xml_component_id=dtplaced.xml_component_id);   
DECLARE @SchemaName nvarchar(max);   
DECLARE @TableName nvarchar(max);   
DECLARE @ColumnName nvarchar(max);   
DECLARE @strSQL nvarchar(MAX);   
OPEN C;   
FETCH NEXT FROM C INTO @SchemaName, @TableName, @ColumnName;   
WHILE (@@FETCH_STATUS = 0)   
BEGIN  
      SET @strSQL = 'INSERT INTO #_dt_collector SELECT x FROM ( ';   
      SET @strSQL = @strSQL +    
                    'SELECT ''' + @SchemaName + '.' + @TableName + '.' + @ColumnName   
                  + ''' as "@Column", ';   
      SET @strSQL = @strSQL +    
      'sum(' + @ColumnName + '.value(''count(//*[. instance of element(*,xs:dateTime?)])'', ''bigint'')) as "@dT_elements"  
     , sum(' + @ColumnName + '.value(''count(//*[. instance of element(*,xs:dateTime?)][substring(string(.),1,1) ="-"])'', ''bigint'')) as "@neg_dT_elements"  
     , sum(' + @ColumnName + '.value(''count(//*[. instance of element(*,xs:date?)])'', ''bigint'')) as "@date_elements"  
     , sum(' + @ColumnName + '.value(''count(//*[. instance of element(*,xs:date?)][substring(string(.),1,1) ="-"])'', ''bigint'')) as "@neg_date_elements"   
     , sum(' + @ColumnName + '.value(''count(for $d in //@*, $v in data($d)  
                      where $v instance of xs:dateTime?   
                      return 1)'', ''bigint'')) as "@dT_attributes"   
     , sum(' + @ColumnName + '.value(''count(for $d in //@*, $v in data($d)   
                      where $v instance of xs:dateTime?   
                      and substring(string($v),1,1)= "-"  
                      return 1)'', ''bigint'')) as "@neg_dt_attributes"  
     , sum(' + @ColumnName + '.value(''count(for $d in //@*, $v in data($d)   
                      where $v instance of xs:date?   
                      return 1)'', ''bigint'')) as "@date_attributes"   
     , sum('+ @ColumnName + '.value(''count(for $d in //@*, $v in data($d)   
                      where $v instance of xs:date?   
                      and substring(string($v),1,1)= "-"  
                      return 1)'', ''bigint'')) as "@neg_date_attributes"'  
      + ' FROM ' + @SchemaName + '.' + @TableName  
      + ' FOR XML PATH(''data''), type) T(x)';   
      --SELECT @strSQL;   
      EXEC sp_executesql @strSQL;   
      FETCH NEXT FROM C INTO @SchemaName, @TableName, @ColumnName;   
END;   
CLOSE C;   
DEALLOCATE C;   
SELECT x as "*" FROM #_dt_collector for xml path(''), root('data');   
drop table #_dt_collector;   
END;   
go  
-- Get the dependent columns per affected XML Schema Collection and the  
-- number of affected values  
EXECUTE DateTimeInvestigation 1;   

負の年の値が見つかった場合は、複数の解決策があります。If negative year values are found, you have multiple solutions:

  • 行を削除します。Delete the rows.

  • 見つかった値を更新します。Update those values.

  • XML 列全体をクリアします。Clear the entire XML column.

  • xs:date または xs:dateTime を使用しないスキーマ コレクションで、XML 列の型を再指定します (たとえば xs:string を使用します)。Retype the XML column with a schema collection that doesn't use xs:date or xs:dateTime (use xs:string for example)

負の年の問題を調整したら、SQL Server 2014SQL Server 2014 にアップグレードできます。After you have reconciled negative year issues, you can upgrade to SQL Server 2014SQL Server 2014.

アップグレード後に SQL Server 2014SQL Server 2014 で XML インデックスを使用するには、xs:date、xs:time、または xs:dateTime を使用するすべての列について、XML インデックスを再構築するか、XML 列の型を再指定する必要があります。To use XML indexes in SQL Server 2014SQL Server 2014 after the upgrade, you must rebuild XML indexes or retype XML columns for all columns that use xs:date, xs:time or xs:dateTime.

参照See Also

データベース エンジンのアップグレードに関する問題Database Engine Upgrade Issues