标签: t-sql

如何获取默认语言的文本

我有这样的表: 在此处输入图片说明

因此语言表中的数据:

在此处输入图片说明

因此文本表中的数据: 在此处输入图片说明

我必须返回请求语言的文本(如果存在)默认语言的文本(如果它不存在)。是否可以在一个查询中做到这一点(不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”(乌克兰语)文本,而这不是该语言的任何文本,那么它将搜索俄语文本。如果找到 - 好的,如果没有,它将寻找英文文本。语言列表可能会有所不同。

sql-server-2008 query cte t-sql

6
推荐指数
1
解决办法
1260
查看次数

具有多列和不同排序选项的 CASE ORDER BY

我试图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 都是 …

stored-procedures order-by t-sql case

6
推荐指数
2
解决办法
4万
查看次数

在 CASE 语句中,哪个更快:“WHEN [field] in (0)”或“WHEN [field] = 0”?

我正在查看另一个人编写的存储过程,并且每个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

6
推荐指数
1
解决办法
5725
查看次数

在数据序列中选择“边缘”记录

我有一个按日期顺序运行的项目表,每个条目都有开始和结束:

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)

sql-server-2005 sql-server-2008 t-sql gaps-and-islands

6
推荐指数
1
解决办法
321
查看次数

传递文字?到 sp_MSforeachdb

我正在尝试搜索?字符串中的字符,但在服务器上的所有数据库中搜索。由于?标记是数据库名称的占位符,我如何格式化查询以便它知道我的意思是搜索?而不是用数据库名称替换它?

此时的 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)

sql-server t-sql

6
推荐指数
1
解决办法
1698
查看次数

更新语句需要永远完成

我有大约 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)

sql-server-2008 sql-server t-sql

6
推荐指数
2
解决办法
1万
查看次数

MERGE 最佳实践的说明

我只是想从“优化 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)

sql-server best-practices t-sql sql-server-2012 merge

6
推荐指数
1
解决办法
2135
查看次数

SMS 建议覆盖索引中的所有列?

我对索引和数据库工作仍然有点新,所以我很可能会遗漏一些明显的东西。

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)

index sql-server t-sql

6
推荐指数
1
解决办法
417
查看次数

给定相同的输入,HASHBYTES 函数是否保证返回相同的输出?

如果我在机器上的脚本中使用 SQL SERVER HASHBYTES() 函数,是否保证在另一台机器/实例上运行时产生相同的输出?

例如,将

SELECT HASHBYTES('SHA1', 'Hello World')

无论 SQL 版本、处理器架构等如何,生成相同的输出?

还会

SELECT HASHBYTES('SHA1', column1) from table1

如果列定义略有不同,则生成相同的输出 - 例如 varchar(50) 与 varchar(100)?

这里有什么需要考虑的吗?

sql-server t-sql

6
推荐指数
1
解决办法
9795
查看次数

将选择查询中的 csv 列拆分为多列

我有一个存储过程

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)

sql-server stored-procedures t-sql

6
推荐指数
1
解决办法
2615
查看次数