TSQL fonction pour renvoyer le nombre de lignes dans un jeu de résultats à partir d'une fonction
J'ai un travail qui effectue plusieurs contrôles de validation sur les lignes de plusieurs tables dans une base de données. Si la vérification échoue, il enregistre l'échec dans un tableau. Les informations enregistrées comprend le nom de la table, un type uniqueidentifier valeur de la ligne qui a échoué, ce qui vérifier qu'il a échoué, et l'emploi qui a été en cours d'exécution à l'époque. Voici la simplification de la définition de la table du journal
CREATE TABLE [tblSY_ValidationFieldFailures](
[pkValidationFieldFailure] [int] IDENTITY(1,1) NOT NULL,
[fkJobID] [int] NOT NULL,
[fkValidationFieldFailureType] [int] NOT NULL,
[TableName] nvarchar(128),
[TableUniqueIdentifier] [nvarchar](100) NULL)
Je voudrais écrire une fonction qui retourne le nombre de lignes échoué étant donné une certaine table et jobID (c'est à dire fnGetNumberOfFailedRows(@JobID, @TableName)). J'ai essayé quelque chose de similaire à la suivante:
CREATE FUNCTION fnGetNumberOfRowsThatFailedValidationCheck
(
@pkJobID int,
@TableName nvarchar(128)
)
RETURNS int
AS
BEGIN
-- Declare the return variable here
DECLARE @NumFailedRows int
Select fkJobID,
TableUniqueIdentifier,
TableName
From tblSY_ValidationFieldFailures
Where fkJobID=@pkJobID And TableName=@TableName
Group By fkJobID, TableName, TableUniqueIdentifier
SET @NumFailedRows = @@ROWCOUNT
RETURN @NumFailedRows
END
Mais bien sûr, vous ne pouvez pas avoir cette instruction Select à l'intérieur d'une fonction. Est-il un moyen de faire ce que je veux à l'intérieur d'une fonction ou dois-je donc la procédure stockée en cours de route?
Vous devez vous connecter pour publier un commentaire.
Cela devrait le faire pour vous:
Vous pouvez utiliser un count(*) déclaration dans votre sélection, et assigner correctement, comme:
Dans SQL Server 2008 et les versions ultérieures, ajouter COUNT(*) SUR () comme l'un des noms de colonnes dans votre requête et qui sera remplie avec le nombre de lignes retournées. Il est répété dans chaque rangée, mais au moins la valeur est disponible. La raison pour laquelle de nombreuses autres solutions ne fonctionnent pas, c'est que, pour de très grands ensembles de résultats, vous ne saurez pas jusqu'à ce que le total après l'itération toutes les lignes ce qui n'est pas pratique dans de nombreux cas (en particulier le traitement séquentiel des solutions). Cette technique vous donne le nombre total après l'appel de la première IDataReader.Read(), par exemple.
select COUNT(*) SUR () comme Total_Rows, ...
à partir de ...