J'ai besoin de préparer une requête dynamique pour trouver la longueur de toutes les lignes d'une colonne de SQL Server. Disons qu'il y a 10 colonnes pour une table avec 100 rangées. J'ai besoin de trouver la longueur de la ligne pour chaque colonne de manière dynamique. P>
3 Réponses :
En supposant que vos colonnes toutes les colonnes sont des colonnes de chaîne, bien que la fonction len code> fonctionne de toute façon. -- replace 'mytable' with the actual table name
declare @tableName nvarchar(128) = 'mytable';
declare @queryToRun nvarchar(max) = '';
-- IMPORTANT: following query is putting each column name as len_columnName
select @queryToRun = @queryToRun + ', len([' + c.name + ']) as [len_' + c.name + ']
'
from sys.tables as t
inner join sys.columns as c on t.object_id = c.object_id
where t.name = @tableName
-- removing the first comma
set @queryToRun = SUBSTRING(@queryToRun, 2, len(@queryToRun) - 1);
-- creating the query with dynamic column names
set @queryToRun = 'select ' + @queryToRun + ' from ' + @tableName;
--print @queryToRun
exec (@queryToRun)
Pouvez-vous le donner dans ce format - Nom de table, Noms de colonne et somme de la longueur des rangées de colonne sage
De len () code > : "Retourne le nombre de caractères de l'expression de chaîne spécifiée, excluant les blancs de fuite b>." DataLength code> A> n'exclut pas les blancs de fuite. Pour les chaînes UNICODE, vous pouvez utiliser DataLength (UNICODESTRINGEXPRESPRESSION) / DataLength (n '#') CODE> Pour obtenir la longueur en caractères. En général DataLength (gauche (regroupement (Strenexpression, '#'), 1)) code> retournera le nombre d'octets par caractère.
@Habo, je ne suis toujours pas sûr de ce que OP essaye de faire, c'est pourquoi je l'ai gardé simple. Sinon, oui ce que vous suggérez est correct et donnerait un résultat précis.
Vous pouvez utiliser sys.tables code> et sys.all_columns code>
Conseil: la meilleure pratique lors de l'assemblage des noms d'objet dans des instructions SQL dynamiques consiste à utiliser QUANNAME () CODE> Pour éviter les problèmes avec des noms impairs, par exemple Nouveau tableau code> avec un espace ou des mots réservés tels que de code>.
Merci pour votre conseil pratique, c'est très utile dans ma langue
Essayez ce script, vous obtiendrez une longueur de données de chaque colonne dans le tableau de manière dynamique
Utilisez-vous MS SQL Server ou PostgreSQL?
Exemples de données? résultat attendu?
@Usmanmirza Résultat devrait donner la somme de la longueur des rangées pour chaque colonne
@jarlh en fait, il devrait fonctionner pour les deux, la migration de SQL Server sur PostgreSQL, il devrait générer un même résultat dans les deux
@sumy, vous souhaitez donc un résultat d'une seule rangée avec une colonne séparée contenant une longueur totale de la valeur de colonne? Est-ce juste pour les colonnes de chaîne? Qu'en est-il des autres types de données? La même requête ne fonctionnera pas pour les deux produits DBMS.
@sum y, vous voulez donc une ligne totale à la fin du résultat qui ont une somme de la longueur de chaque colonne à droite?
@Danguzman en fait, j'ai besoin d'une requête pour la validation de données I.e Les données totales doivent être migrées à partir de SQL Server vers Postgres, afin de vérifier les données que je souhaite cette requête, oui il existe d'autres types de données.
@Usmanmirza Oui S'il y a 10 colonnes, le résultat doit avoir 10 noms de colonne ainsi que la longueur des lignes dans chaque colonne.
@sumy. . . Veuillez expliquer ce que cela est censé vouloir dire: "Je dois trouver la longueur de la ligne pour chaque colonne de manière dynamique." La déclaration n'a aucun sens pour moi. Les colonnes n'ont pas de "longueurs de ligne".
@Gordonlinoff somme de la longueur de toutes les lignes de cette colonne - Résultat doit avoir la table_name, Nom de colonne et la somme ci-dessus