Return 存储过程中的行

Return rows in stored procedure

我正在尝试在 ASP.NET 中开发一个包含两种语言的博客和类别的应用程序。其中一项功能是 return 以特定语言命名类别名称。

并非所有类别都有两种语言。有些会说英语,有些会说意大利语,有些则两者都有。这是执行我正在谈论的 select 的函数。

DECLARE @Name NVARCHAR(250)

IF EXISTS(SELECT Name = Coalesce(BlogCategoryTranslation.Name, ' ')
          FROM BlogCategoryTranslation 
          WHERE BlogCategoryID = @CategoryID AND LanguageID = @LanguageID)
BEGIN   
    SET @Name = (SELECT Name
                 FROM BlogCategoryTranslation 
                 WHERE BlogCategoryID = @CategoryID 
                   AND LanguageID = @LanguageID)    
END 
ELSE
BEGIN
    SET @Name = (SELECT TOP 1 Name 
                 FROM BlogCategoryTranslation 
                 WHERE BlogCategoryID = @CategoryID 
                   AND LanguageID = @LanguageID);
END

RETURN @Name

下面有一个存储过程,它 return 是给定语言的类别名称。我想要的是总是 return 一个类别。如果它不存在于特定语言中,我想以其他语言显示记录。

这可能吗?如果可能,建议是什么?

ALTER PROCEDURE [dbo].[BlogCategoryLanguage]
    @BlogCategoryID INT,
    @LanguageID INT
AS
BEGIN
    SELECT 
        BlogCategoryID AS 'CategoryID',
        Language.Name AS 'Language',
        dbo.BlogNameCategoryByLanguage(1,1) as 'Name',
        dbo.Blog_PublishedInCategory(1,BlogCategory.ID) AS 'Published'
    FROM 
        BlogCategoryTranslation
    INNER JOIN 
        BlogCategory ON BlogCategory.ID = BlogCategoryTranslation.BlogCategoryID
    INNER JOIN 
        Language ON Language.ID = BlogCategoryTranslation.LanguageID
    WHERE 
        BlogCategoryID = 1
END

我非常感谢一些提示。这是我第一次在这里发布问题,我不太确定它是如何工作的。如果这是转载,请见谅。

您可以像这样使用基于 CASEORDER BYTOP 1

ORDER BY CASE WHEN LanguageID = @LanguageID THEN 1 ELSE 2 END ASC 将优先选择带有 LanguageID = @LanguageID 的语言。如果该语言不适用于当前 @Category,它将随机选择一种适用于该类别的语言。

像这样。

DECLARE @Name NVARCHAR(250)
SELECT @Name = TOP 1 Name
FROM BlogCategoryTranslation
WHERE BlogCategoryID = @CategoryID
ORDER BY CASE WHEN LanguageID = @LanguageID THEN 1 ELSE 2 END ASC;

RETURN @Name

编辑

您可以像这样在主存储过程中使用相同的 ORDER BYTOP 1

SELECT TOP 1 
    BlogCategoryID AS 'CategoryID',
    Language.Name AS 'Language',
    dbo.BlogNameCategoryByLanguage(1,1) as 'Name',
    dbo.Blog_PublishedInCategory(1,BlogCategory.ID) AS 'Published'
FROM 
    BlogCategoryTranslation
INNER JOIN 
    BlogCategory ON BlogCategory.ID = BlogCategoryTranslation.BlogCategoryID
INNER JOIN 
    Language ON Language.ID = BlogCategoryTranslation.LanguageID
WHERE 
    BlogCategoryID = 1
ORDER BY CASE WHEN Language.LanguageID = @LanguageID THEN 1 ELSE 2 END ASC