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
我非常感谢一些提示。这是我第一次在这里发布问题,我不太确定它是如何工作的。如果这是转载,请见谅。
您可以像这样使用基于 CASE
的 ORDER BY
和 TOP 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 BY
和 TOP 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
我正在尝试在 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
我非常感谢一些提示。这是我第一次在这里发布问题,我不太确定它是如何工作的。如果这是转载,请见谅。
您可以像这样使用基于 CASE
的 ORDER BY
和 TOP 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 BY
和 TOP 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