我有这样的表:

因此语言表中的数据:

因此文本表中的数据:

我必须返回请求语言的文本(如果存在)和默认语言的文本(如果它不存在)。是否可以在一个查询中做到这一点(不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
我正在尝试搜索?字符串中的字符,但在服务器上的所有数据库中搜索。由于?标记是数据库名称的占位符,我如何格式化查询以便它知道我的意思是搜索?而不是用数据库名称替换它?
此时的 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 2014,我很喜欢它。
我遇到过一些场景,我会将一个包含 70,000 行和大约 10-12 列的 Excel 文档导入 SQL Server(一个表),利用它来比较/插入/修改其他表中的现有数据。我目前正在使用 GUI 中可用的手动功能(右键单击 >> 任务 >> 导入)在需要时进行导入和导出;但是,我的一位同事告诉我,同样的过程也可以通过脚本/查询来完成。
有人可以让我知道编写查询以将 XLS、XLSX、CSV 格式文件导入表的正确方法是什么吗?
PS:我也试着读一些职位约OPENDATASOURCE和OPENROWSET在那里我已经没有成功,始终得到了一些错误,对此我没有任何线索。所以,想看看是否还有其他方法,并热衷于学习他们的程序。
我才发现, 通过纯粹的光彩意外的是,SQL Server 允许您创建没有任何名称的变量、参数、表变量、临时表(本地和全局)和临时存储过程(本地和全局)!好吧,至少不是我认为的名字。意思是,您可以指定DECLARE @ INT = 5;并且这是有效的 T-SQL:它执行时没有错误,甚至没有在 SSMS 中用红色波浪线下划线标记(本问题末尾显示了完整示例列表的代码)。
鉴于数据库标识符的 MSDN 页面指出(强调我的):
有两类标识符:
常规标识符
...
分隔标识符
... 常规标识符和分隔标识符都必须包含1 到128 个字符。对于本地临时表,标识符最多可以有 116 个字符。
这当然看起来不像预期的行为,我最初认为这是一个缺陷(不会导致任何错误,但似乎不是“正确”的行为)并提交了一个连接错误:参数、变量和临时表和过程名称/标识符可以为空。
然而,同一个 MSDN 页面还指出:
常规标识符规则
变量、函数和存储过程的名称必须符合以下 Transact-SQL 标识符规则。
第一个字符必须是以下字符之一:
- Unicode 标准 3.2 定义的字母。字母的 Unicode 定义包括从 a 到 z、从 A 到 Z 的拉丁字符,以及来自其他语言的字母字符。
下划线 (_)、at 符号 (@) 或数字符号 (#)。
标识符开头的某些符号在 SQL Server 中具有特殊含义。以 at 符号开头的常规标识符始终表示局部变量或参数,不能用作任何其他类型对象的名称。以数字符号开头的标识符表示临时表或过程。以双数字符号 (##) 开头的标识符表示全局临时对象。尽管可以使用数字符号或双数字符号字符作为其他类型对象的名称的开头,但我们不推荐这种做法。
因此,可以解释为,名称的 1 个字符的最低要求(从显示“1 到 128 …
我是数据库的新手,事实上,我是编程的新手。我想创建一个函数或者一个存储过程(如果它有效)来为用户表的一列插入/创建默认值。在这个表中,每个注册用户都应该被分配一个userId like K16060600,格式为Kyymmddxx,其中
K对于每个userId都是常数,yy代表年份(例如162016 年),mm 代表月份,dd 代表白天,xx 是一个 00 到 99 的数字,每当添加新行/用户时,它应该从 00 递增。我怎样才能做到这一点?
我使用的是 Visual Studio 2012 和 SQL Server 2012。
This is a simple one but I can't seem to figure it out.
I have two parameters, 1 and 2. If one parameter is passed a null value, use the other parameter in there WHERE clause.
Ex:
SELECT ...
WHERE CASE
WHEN @Parameter1 IS NULL
THEN Field2 = @Parameter2
WHEN @Parameter2 IS NULL
THEN Field1 = @Parameter1
END
Run Code Online (Sandbox Code Playgroud)
I know this is something simple or maybe I'm using my logic wrong. Any help or direction is appreciated.
我正在执行下面的查询,但我遇到了问题。
注意:SQL 2008 R2 和 SQL 2014 在 Win 2008 R2 和 Win 2012 R2 上使用两个差异服务帐户运行。TCP 端口、防火墙端口都与远程连接一起启用,我能够在本地机器上执行代码(例如:如果我连接到 SQL 2008 R2 机器并在 SQL 2008 R2 上执行成功,如果我连接到 SQL 2014 机器成功在 SQL 2014 上的 SSMS 上。问题仅在我连接到 SQL 2008 R2 并在 SQL 2014 上执行时出现。当我删除注释部分时,我能够使用 SQLCMD 成功执行代码。)我不知道这有任何兼容性问题案件。
Msg 121, Level 20, State 0, Line 0
从服务器接收结果时出现传输级错误。(提供者:TCP 提供者,错误:0 - 信号量超时期限已过期。)
但是当我删除注释部分并执行查询时,它在几秒钟内成功运行。请让我知道评论部分有什么问题。我在下面粘贴了 T-SQL 查询。
/********************************************************************************
* Summary: Creates source database schema for BCP Import. Only created PK on the tables
* No other constraints are replicated
* …Run Code Online (Sandbox Code Playgroud) 我有XML 结构,它是我的存储过程的输入参数。它包含带有& 的元素(在 XML 中转义)。当我提取该元素以VARCHAR接收& 时,它不是有效的 XML 字符。在再次转换为 XML 之前,我需要对其进行转义。如何做到这一点没有REPLACE?
我有以下文字:param1=xyz¶2=dasdasdfdas¶m3。它是查询字符串的一部分。我将其转换XML并作为 XML 结构的一部分发送:
<zzz xmlns="http://example.com">
<aaa>aaa</aaa>
<bbb>param1=xyz&para2=dasdasdfdas&param3</bbb>
</zzz>
Run Code Online (Sandbox Code Playgroud)
在存储过程中,我需要提取它。我这样做:
ISNULL(NULLIF(LTRIM(RTRIM(@XMLInput.value('declare default element namespace "http://example.com"; (zzz/bbb)[1]', 'NVARCHAR(250)'))), ''), '');
Run Code Online (Sandbox Code Playgroud)
之后,该值包含普通文本(& -s 未转义 - &)。
经过一些处理后,我需要将该字符串放入其他 XML 中。我做:
CAST( ... AS XML);
因为& -s 没有转义,所以我出错了。
t-sql ×10
sql-server ×7
case ×1
cte ×1
order-by ×1
parameter ×1
performance ×1
query ×1
xml ×1