27

これはクエリです:

  1. いくつかのNULL値がリストに表示されているようです。
  2. 一部のNULL値、クエリによって除外されています。確認しました。
  3. 追加するAND AdditionalFields = ''と、これらの結果は両方とも返されます
  4. AdditionalFieldsはvarchar(max)です
  5. データベースは、互換性レベル= Sql Server 2005(90)のSQLServer10です。
  6. ManagementStudio2008を使用しています

長さがNULLの空の文字列、または空の文字列と等しいNULL値があるようです。これは新しいデータ型ですか?!

編集: 新しいデータ型-これにより「Numpty」と呼ばれます

編集2 データを一時テーブルに挿入すると、NumptiesがNULLに変わります。(このSQLの結果は10です)

CREATE TABLE #temp(ID uniqueidentifier , Value varchar(max))

INSERT INTO #temp 
SELECT top 10 g.ID, g.AdditionalFields
FROM grants g 
WHERE g.AdditionalFields IS NOT NULL AND LEN(g.AdditionalFields) IS NULL

SELECT COUNT(*) FROM #temp WHERE Value is null

DROP TABLE #temp

編集3 そして私は更新を実行することによってデータを修正することができます:

UPDATE Grants SET AdditionalFields = NULL
WHERE AdditionalFields IS NOT NULL AND LEN(AdditionalFields) IS NULL

そのため、スキーマ定義の問題ではなく、フィールドに何かが含まれている必要があると思います。しかし、それは何ですか?そして、どうすればそれが戻ってくるのを止めることができますか?

編集4 私のデータベースには他に2つのフィールドがあります。どちらも、フィールドがNULLではなくLEN(field)がNULLの場合に行を返すvarchar(max)です。これらのフィールドはすべて、かつてはTEXTであり、VARCHAR(MAX)に変更されました。データベースもSqlServer2005から2008に移動されました。デフォルトでANSI_PADDINGなどがオフになっているようです。

もう一つの例: ここに画像の説明を入力してください

varbinaryへの変換 ここに画像の説明を入力してください

実行計画: 実行計画 編集5:テーブル定義を削除-最終的には関係がないことが判明

6つのスクリプトを編集 して、TEXTをVARCHAR(MAX)に変更するためのスクリプトを生成し、値を更新してバグを防ぎ、パフォーマンスを向上させます

--Generate scripts to alter TEXT to VARCHAR(MAX)
SELECT 'ALTER TABLE [' + tab.table_schema + '].[' + tab.table_name  + '] ALTER COLUMN [' + col.column_name + '] VARCHAR(MAX)' + CASE WHEN col.IS_NULLABLE = 'YES' THEN ' NULL' ELSE ' NOT NULL' END + ' GO'
FROM INFORMATION_SCHEMA.tables tab
INNER JOIN INFORMATION_SCHEMA.COLUMNS col ON col.table_name = tab.table_name
          AND tab.table_schema = col.table_schema
          AND tab.table_catalog = col.table_catalog
WHERE tab.table_type <> 'VIEW' and col.DATA_TYPE = 'text'

--Generate scripts to set value to value in VARCHAR(MAX) fields
SELECT 'UPDATE [' + tab.table_schema + '].[' + tab.table_name  + '] SET [' + col.column_name + '] = [' + col.column_name + ']'
FROM INFORMATION_SCHEMA.tables tab
INNER JOIN INFORMATION_SCHEMA.COLUMNS col ON col.table_name = tab.table_name
          AND tab.table_schema = col.table_schema
          AND tab.table_catalog = col.table_catalog
WHERE tab.table_type <> 'VIEW' AND col.DATA_TYPE = 'varchar' and col.CHARACTER_MAXIMUM_LENGTH = -1
4

5 に答える 5

19

上記の動作を再現するためのサンプルコードを入手しました。この問題はTEXT、行に収まらない値よりも大きい値を格納するフィールドがあり、後でそれをに設定しNULLて列変換をに実行した場合に発生しますVARCHAR(MAX)

大きな値は別のページに保存されます。次に、このフィールドの値をに設定しますNULL。この列をに変換すると、VARCHAR(MAX)SQLServerは正しく機能しないようです。通常、TEXT変換VARCHAR(MAX)では、外部ページはそのままですが、に設定されているためかNULL、列を変更すると混乱します。

更新:TEXT列の大きな値とは何の関係もないようです。短い値は同じ動作を示します(拡張サンプル)。したがって、重要なのは、をNULL介した明示的な設定UPDATEと変換だけです。

CREATE TABLE [dbo].[Test](
    [Id] [int] NOT NULL,
    [Value] [text] NULL,
 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

INSERT INTO Test VALUES (1, 'test')
INSERT INTO Test VALUES (2, '')
INSERT INTO Test VALUES (3, NULL)
INSERT INTO Test VALUES (4, '012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789')
INSERT INTO Test VALUES (5, 'short string')
GO

update test SET value = null where ID = 4
update test SET value = null where ID = 5
GO

ALTER TABLE test ALTER COLUMN value varchar(max)
GO

select id, value, len(value) as length
from test
where value is not null
GO

結果は次のとおりです。

1   test    4
2           0
4   NULL    NULL
5   NULL    NULL

この問題の簡単な修正は、VARCHAR(MAX)列の値を再割り当てすることです。

UPDATE Test SET value = value

これにより、以前に外部ページに保存されていた行に値が配置されているようです。(参照:SQL 2005のNTEXTとNVARCHAR(MAX)

于 2012-04-27T09:26:17.193 に答える
6

これは、SQL ServerInternalsViewerを使用して個々のステージを確認するMcSimの回答への追加にすぎません。

CREATE TABLE [dbo].[Test](
    [Id] [int] NOT NULL PRIMARY KEY ,
    [Value] [text] NULL)


INSERT INTO Test VALUES (1, '')

最初の挿入後の行

メイン行を挿入した後

最初の挿入後のテキスト値

テキスト値を挿入した後

update [Test] SET [Value] = null 

に更新した後の行NULL

これは前に示した行と同じなので、スクリーンショットを繰り返していません。具体的には、は新しい値を反映するように更新されNULL_BITMAPません。NULL

に更新した後のテキスト値NULL

更新後のテキスト値

Typeビットが変更され、InternalsViewerはこれを列の値を含まなくなったと表示しDataます。

この時点で、以下を正しく実行しても行は返されません

SET STATISTICS IO ON
select [Id]
from [Test]
where [Value] is not null

したがって、SQL Serverはテキストポインタに従い、そこで値を調べてNULL可能性を判断する必要があります。

ALTER TABLE [Test] ALTER COLUMN [Value] varchar(max)

これはメタデータのみの変更です。行内データと行外データはどちらも変更されません。

ただし、この時点で次を実行すると、行が誤って返されます。

SET STATISTICS IO ON
select [Id]
from [Test]
where [Value] is not null

の出力STATISTICS IO

スキャンカウント1、論理読み取り2、... lob論理読み取り1

は、実際にはまだテキストポインタをたどっていることを示していますが、おそらくvarchar(max)、別のコードパスが存在する必要があり、NULL_BITMAP関係なく(最初の挿入以降、値が更新されていない)から値を取得することになります。

于 2012-04-28T11:42:39.840 に答える
1

コリン:

私は、データベース変換のためにこれがすべて起こっているとかなり確信しています。このことをできるだけ早く解決する必要があるので、AdditionalFieldsデータが最初に問題ないことを保証し、これが後に発生する理由を理解することをお勧めします。

  1. バックアップを実行します。
  2. このT-SQLを実行します。

    update grants
    set AdditionalFields = ltrim(rtrim(isnull(AdditionalFields,'')))
    

isnull関数は、null値を空の文字列に変換します。左右のトリムにより、複数のスペースがあるフィールドでも同じ値になることが保証されます。

これを実行して、後で結果をフィードバックしていただけますか?

よろしくお願いします

于 2012-04-26T16:51:43.693 に答える
0

他の人が指摘しているように、この結果は完全に不可能です。

  1. 実際の実行計画のスクリーンショットを投稿してください。
  2. dbcc checkdbを実行し、エラーメッセージがあれば投稿してください。

(2)は今のところ私のお気に入りです。

于 2012-04-26T13:32:16.300 に答える
0

NULLという単語がデータベースに格納されていると思われます。select*fromblahを使用してください。mycolumn='NULL'

于 2014-05-26T01:47:56.567 に答える