我有这样的表:

因此语言表中的数据:

因此文本表中的数据:

我必须返回请求语言的文本(如果存在)和默认语言的文本(如果它不存在)。是否可以在一个查询中做到这一点(不while,拜托)?
代码:
DECLARE @CommentId bigint = 1
--DECLARE @LanguageCode nvarchar(2) = 'en' -- "english text" returns
DECLARE @LanguageCode nvarchar(2) = 'ua' -- nothing at this moment
SELECT
t.CommentId
,t.TextId
,t.[Text]
,t.LanguageId
,RequestedLanguageId = @LanguageCode
FROM dbo.common_Text t
INNER JOIN dbo.common_LanguageType l
ON t.LanguageId = l.LanguageId
WHERE l.Code = @LanguageCode
AND t.CommentId = @CommentId
Run Code Online (Sandbox Code Playgroud)
谢谢你。
添加:
如果代码请求“ua”(乌克兰语)文本,而这不是该语言的任何文本,那么它将搜索俄语文本。如果找到 - 好的,如果没有,它将寻找英文文本。语言列表可能会有所不同。
我试图CASE ORDER BY在存储过程中使用 T-SQL,在其中我将 @OrderBy 参数作为 TINYINT 传递。
@Orderby = 1 Then Date column should be ASC@Orderby = 2 Then Date column should be DESC我的问题是:当我为该参数传递 2 时,如何让日期列对 desc 进行排序,并在同一个 CASE ORDER BY 语句中将字符串列按 asc 排序?
这就是我现在所拥有的 CASE ORDER BY
ORDER BY
CASE WHEN @OrderBy = 1 THEN CONVERT(NVARCHAR(30) , ccd.CertEndDate) + tp.LastName + tp.FirstName END ,
CASE WHEN @OrderBy = 2 THEN CONVERT(NVARCHAR(30) , ccd.CertEndDate) + tp.LastName + tp.FirstName END DESC
Run Code Online (Sandbox Code Playgroud)
此代码解析并返回一个结果集没有错误,但第二个 CASE ORDER BY 都是 …
我正在查看另一个人编写的存储过程,并且每个WHEN子句都使用IN语句而不是=. 我的直觉告诉我这没有那么快、效率高等等。
例如:
CASE WHEN a.Indicator in ('Yes') then 'something'
WHEN a.STATUS in (0) then 'something 0'
WHEN a.STATUS in (1) then 'something 1'
WHEN a.STATUS in (2) then 'something 2'
WHEN a.STATUS in (3,4,5,6,7,8) then 'something big'
END
Run Code Online (Sandbox Code Playgroud)
使用IN而不是更快=吗?
performance sql-server-2008 sql-server stored-procedures t-sql query-performance
我有一个按日期顺序运行的项目表,每个条目都有开始和结束:
ID | Start | End
----------------------------------------
1 | 2012-08-20 00:00 | 2012-08-20 23:59
2 | 2012-08-21 00:00 | 2012-08-21 23:59
3 | 2012-08-22 00:00 | 2012-08-22 23:59
4 | 2012-08-23 00:00 | 2012-08-23 23:59
5 | 2012-08-24 00:00 | 2012-08-24 23:59
6 | 2012-08-28 00:00 | 2012-08-28 23:59
7 | 2012-08-29 00:00 | 2012-08-29 23:59
8 | 2012-08-30 00:00 | 2012-08-30 23:59
Run Code Online (Sandbox Code Playgroud)
请注意,数据中存在差距(周末和银行假期)。是否可以编写一个查询来选择间隙边缘的记录?我想要的是一种通用的方式来结束这样的事情:
ID | Start | End
----------------------------------------
1 | 2012-08-20 09:00 | 2012-08-20 23:59
2 | 2012-08-21 …Run Code Online (Sandbox Code Playgroud) 我正在尝试搜索?字符串中的字符,但在服务器上的所有数据库中搜索。由于?标记是数据库名称的占位符,我如何格式化查询以便它知道我的意思是搜索?而不是用数据库名称替换它?
此时的 WHERE 子句是:
WHERE DirectoryPath LIKE ''%?%''
Run Code Online (Sandbox Code Playgroud)
这导致:
WHERE DirectoryPath LIKE '%DATABASENAME%'
Run Code Online (Sandbox Code Playgroud)
我需要它呈现为:
WHERE DirectoryPath LIKE '%?%'
Run Code Online (Sandbox Code Playgroud) 我有大约 1250000 条记录和 80 列
表结构
CREATE TABLE [dbo].[Table] (
[Column1] [int] IDENTITY(1, 1) NOT FOR REPLICATION NOT NULL, [Column2] [int] NULL, [Column3] [int] NULL,
[Column4] [int] NULL, [Column5] [int] NULL, [Column6] [int] NULL, [Column7] [int] NULL, [Column8] [int] NULL,
[Column9] [int] NULL, [Column10] [varchar](20) NULL, [Column11] [datetime] NULL, [Column12] [int] NULL,
[Column13] [money] NULL, [Column14] [money] NULL, [Column15] [varchar](40) NULL, [Column16] [int] NULL,
[Column17] [int] NULL, [Column18] [varchar](20) NULL, [Column19] [varchar](50) NULL, [Column20] [int] NULL,
[Column21] [int] NULL, [Column22] …Run Code Online (Sandbox Code Playgroud) 我只是想从“优化 MERGE 语句性能”页面。
我正在使用一个数据仓库,它从许多不同的数据库中获取记录并存储数据。我的仓库数据库中的所有表基本上都遵循相同的模式:
CREATE TABLE Foo (
database_guid UNIQUEIDENTIFIER
,FooPk BIGINT
,Bar NVARCHAR(20)
,Qix NCHAR(10)
,CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED (
database_guid ASC
,FooPk ASC
)
)
GO
CREATE PROCEDURE [iv].[LoadSomeTable]
@databaseGUID UNIQUEIDENTIFIER
AS
BEGIN
SET NOCOUNT ON
MERGE Foo
USING #FooStaging AS Source
ON Foo.FooPk = Source.FooPk AND Foo.database_guid = @databaseGUID
WHEN MATCHED THEN
UPDATE SET Bar = Source.Bar
,Qix = Source.Qix
WHEN NOT MATCHED THEN
INSERT (database_guid, FooPk, Bar, Qix)
VALUES (@databaseGUID, FooPk, Bar, Qix); …Run Code Online (Sandbox Code Playgroud) 我对索引和数据库工作仍然有点新,所以我很可能会遗漏一些明显的东西。
SMS 建议在我的一个表中添加一个覆盖索引,我认为该列上的索引非常有意义。但是,它还建议在表中每隔一列包括(覆盖)。对我来说,这似乎是将整个表移动到索引中。我认为这可能是一个坏主意。在这种情况下,SMS 是否可能误导我?
更一般地说,是否有任何理由覆盖表中的每一列?
SELECT *
FROM SlideshowImages SI
JOIN Files F ON F.PK_FileID = SI.FK_FileID
WHERE F.FK_ModuleID = 81
AND F.ParentType = 2
AND F.FK_ItemID = @SlideshowID
ORDER BY F.[Order] ASC
Run Code Online (Sandbox Code Playgroud)

SMS 的建议索引 - SlideshowImages 表的所有 10 列:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[SlideshowImages] ([FK_FileID])
INCLUDE ([PK_SlideshowImageID],[Title],[Caption],[IsLink],[LinkAddress],[StartDate],[EndDate],[AltText],[OpenInNewWindow])
Run Code Online (Sandbox Code Playgroud) 如果我在机器上的脚本中使用 SQL SERVER HASHBYTES() 函数,是否保证在另一台机器/实例上运行时产生相同的输出?
例如,将
SELECT HASHBYTES('SHA1', 'Hello World')
无论 SQL 版本、处理器架构等如何,生成相同的输出?
还会
SELECT HASHBYTES('SHA1', column1) from table1
如果列定义略有不同,则生成相同的输出 - 例如 varchar(50) 与 varchar(100)?
这里有什么需要考虑的吗?
我有一个存储过程
SELECT [ShipWorks].[dbo].[OrderItem].[Code] AS Code,
CASE WHEN (LEN(ISNULL(MAX([ShipWorks].[dbo].[OrderItem].[Location]),'')) = 1)
THEN MAX([ShipWorks].[dbo].[OrderItem].[Location])
ELSE MAX([Picklist].[dbo].[ItemData].[InventoryLocation])
END AS Location,
SUM([ShipWorks].[dbo].[OrderItem].[Quantity]) AS Quantity,
MAX(LEFT([ShipWorks].[dbo].[Store].[StoreName], 1)) AS Store
FROM [ShipWorks].[dbo].[OrderItem]
INNER JOIN [ShipWorks].[dbo].[Order] ON [ShipWorks].[dbo].[OrderItem].[OrderID] = [ShipWorks].[dbo].[Order].[OrderID]
INNER JOIN [ShipWorks].[dbo].[Store] ON [ShipWorks].[dbo].[Order].[StoreID] = [ShipWorks].[dbo].[Store].[StoreID]
LEFT JOIN [ShipWorks].[dbo].[AmazonOrder] ON [ShipWorks].[dbo].[AmazonOrder].[OrderID] = [ShipWorks].[dbo].[Order].[OrderID]
LEFT JOIN [Picklist].[dbo].[ItemData] ON [Picklist].[dbo].[ItemData].[InventoryNumber] = [ShipWorks].[dbo].[OrderItem].[Code] OR
[Picklist].[dbo].[ItemData].[MediaCreator] = [OrderItem].[Code]
WHERE [ShipWorks].[dbo] [Order].[LocalStatus] = 'Recently Downloaded' AND ([ShipWorks].[dbo].[AmazonOrder].[FulfillmentChannel] = 2 OR [ShipWorks].[dbo].[Store].[StoreName] <> 'Amazon')
GROUP BY [ShipWorks].[dbo].[OrderItem].[Code]
ORDER BY Location
Run Code Online (Sandbox Code Playgroud)
返回这个:
Code …Run Code Online (Sandbox Code Playgroud)