Impossible de créer une ligne de taille 8064 qui est supérieur à la limite permise de taille de ligne 8060
J'ai cette étrange problème lors de l'ajout d'une colonne à une table existante.
La table existante ressemble :
CREATE TABLE [BinaryAssets].[BinaryAssets](
[BinaryAssetId] [int] IDENTITY(1,1) NOT NULL,
[BinaryAssetStructureId] [int] NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[Created_By] [int] NOT NULL,
[Created_On] [bigint] NOT NULL,
[Modified_By] [int] NOT NULL,
[Modified_On] [bigint] NOT NULL,
[Active] [bit] NOT NULL,
CONSTRAINT [PK_BinaryAsset] PRIMARY KEY NONCLUSTERED
(
[BinaryAssetId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Maintenant, le sql, je suis en train d'exécuter ressemble :
ALTER TABLE BinaryAssets.BinaryAssets ADD
[Version] INT NOT NULL CONSTRAINT DF_BinaryAssets_Version DEFAULT 1
ALTER TABLE BinaryAssets.BinaryAssets
DROP CONSTRAINT DF_BinaryAssets_Version
Quand je suis en train d'exécuter-je obtenir une sqlexception (voir le Titre).
Maintenant, je ne pense pas que ma table dépasse 8060, alors quel est le problème ici. Chose étrange, c'est que lorsque je modifie par exemple le Nom de type nvarchar(max), nvarchar(100), puis l'exécution de mes nouvelles sql et ensuite changer l'ordre de 100 à MAX, il ne fonctionne pas... logique semble loin d'ici.
Quelqu'un peut-il me dire ce que je fais mal?
que mettrez-vous en [Nom] qui nécessite de type nvarchar(max) ? Tu ne peux pas utiliser de type nvarchar(100)?
Je comprends les réponses vous dire les 8000 est la taille maximale d'un enregistrement. Mais comment est-ce que vous pouvez la redimensionner pour max, plus tard... Ce n'est qu'une (très fou) deviner: peut-être que max est en indiquant "utiliser tout l'espace disponible" et lorsque vous la créez, sqlserver est de réserver l'espace disponible pour l'instant (avant d'arriver en compte le reste des champs). Donc, vous pourriez essayer de créer la table avec le [Nom] dans la dernière position, pour voir ce qui se passe 🙂 (juste pour le fun)
Mmm, en effet, que peut-être, mais je continue de trouver ça étrange.
Pouvez-vous modifier le post / balises pour indiquer SQL 7/2000/2005/2008 puisque les réponses pour SQL 2000/7 serait totalement erroné si c'est 2005/2008
J'ai essayé de reproduire ce en vain - même si j'spécifiquement le premier de la page et de vérification préalable à la commande alter (à l'aide de la commande dbcc ind / dbcc page pour vérifier que je suis à la limite) je n'arrive pas à lancer l'erreur. Est-il autre chose que vous avez omis ou de la simplification que vous avez appliqué?
Je comprends les réponses vous dire les 8000 est la taille maximale d'un enregistrement. Mais comment est-ce que vous pouvez la redimensionner pour max, plus tard... Ce n'est qu'une (très fou) deviner: peut-être que max est en indiquant "utiliser tout l'espace disponible" et lorsque vous la créez, sqlserver est de réserver l'espace disponible pour l'instant (avant d'arriver en compte le reste des champs). Donc, vous pourriez essayer de créer la table avec le [Nom] dans la dernière position, pour voir ce qui se passe 🙂 (juste pour le fun)
Mmm, en effet, que peut-être, mais je continue de trouver ça étrange.
Pouvez-vous modifier le post / balises pour indiquer SQL 7/2000/2005/2008 puisque les réponses pour SQL 2000/7 serait totalement erroné si c'est 2005/2008
J'ai essayé de reproduire ce en vain - même si j'spécifiquement le premier de la page et de vérification préalable à la commande alter (à l'aide de la commande dbcc ind / dbcc page pour vérifier que je suis à la limite) je n'arrive pas à lancer l'erreur. Est-il autre chose que vous avez omis ou de la simplification que vous avez appliqué?
OriginalL'auteur Lieven Cardoen | 2010-01-25
Vous devez vous connecter pour publier un commentaire.
La plus grande taille, vous pouvez donner un
nvarchar
champ est deMAX
, qui est de 4000 caractères (2 octets Unicode caractères).Si vous avez besoin de stocker plus de corps de texte, vous devriez être en utilisant soit
texte
ountext
, qui peuvent tenir autant de texte que votre système dispose d'espace sur le disque dur.Vous semblent essayer de créer une ligne avec une taille plus que la taille possible, ce qui n'est pas une opération valide.
OriginalL'auteur Esteban Küber
Définir la
sp_tableoption
procédure stockée'large value types out of row'
option pour stocker hors du champ de la page.Pourquoi l'affiche à l'aide d'un type de données TEXTE? Ils sont obsolètes et ont été replcaced avec nvarchar(max), varchar(max), et varbinary(max). Voir la documentation en Ligne SQL Server: msdn.microsoft.com/en-us/library/ms187993.aspx
Jean Sansom est correct msdn.microsoft.com/en-us/library/ms178158.aspx
OriginalL'auteur gingerbreadboy
Dans SQL Server 2005/2008, la taille de la page est le même (8K), mais la base de données utilise des pointeurs de la ligne dans la page pour pointer vers d'autres pages qui contiennent des champs plus larges. Cela permet de 2005 à surmonter les 8K ligne limitation de la taille.
OriginalL'auteur John Sansom