小编Muf*_*lix的帖子

具有多个条件的案例

我需要根据几个条件更改 select 语句中的返回值。我试过这样的事情:

,CASE i.DocValue
  WHEN 'F2' AND c.CondCode IN ('ZPR0','ZT10','Z305') THEN c.CondVal
  ELSE 0
END as Value
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用以及推荐的方法是什么?接下来会有几个 WHEN 条件。

谢谢

sql-server

23
推荐指数
2
解决办法
35万
查看次数

从左边出现第二个特定字符后删除字符串

我在表列中有这种类型的值

154646@8@486
45465@6464@654
Run Code Online (Sandbox Code Playgroud)

等等。

如何在第二个@ 字符后删除所有内容?我需要显示

154646@8
45465@6464
Run Code Online (Sandbox Code Playgroud)

我只能为所有@ 做,但不能为第二个做

SELECT REPLACE(LEFT('45@Tra@lala', CHARINDEX('@','45@Tra@lala')-1),'_',' ')
Run Code Online (Sandbox Code Playgroud)

返回45但不返回45@Tra

谢谢 :-)

sql-server

10
推荐指数
1
解决办法
5万
查看次数

标量函数的交叉应用

我有这个:

SELECT
A
,B
,dbo.Func(C)
,dbo.Func(D)
,dbo.Func(E)
,F
FROM abcdef
WHERE
0 = dbo.Func(C) + dbo.Func(D)
Run Code Online (Sandbox Code Playgroud)

我读过这不是一个好的做法,因为该函数被调用了数百万次并且对性能产生了不良影响。

我试图用 CROSS APPLY 重写它:

SELECT *
 FROM abcdef
  CROSS APPLY dbo.Func(D) as FD
Run Code Online (Sandbox Code Playgroud)

但它返回此错误:

Invalid object name 'dbo.Func'
Run Code Online (Sandbox Code Playgroud)

我可以只在 TABLE VALUED 函数上使用 CROSS APPLY 吗?

CROSS APPLY 是否适用于标量函数(转换为表值函数)?因为在我的小型性能测试中,CROSS APPLY 有点慢。

sql-server cross-apply

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

如何更改 T-SQL 调试器的默认端口

T-SQL Debugger 的默认端口是 135,是否可以更改此端口?在我的公司中,此端口位于禁止端口的特殊列表中,因此我们需要在另一个端口号上打开该服务。

我正在关注这篇文章:

用于 SQL Server 2008 的 Transact-SQL 调试器——Bill Ramos 的第 2 部分

sql-server sql-server-2008-r2 configuration debugging

5
推荐指数
1
解决办法
267
查看次数

如何在 SSDT 部署中将 CLR 程序集注册为受信任

我在 SSDT 中有 CLR 程序集,并且部署它必须是可信的。据我所知,有 4 个选项如何做到这一点

第一个选项,使用 TRUSTWORTHY

EXEC sp_configure 'clr enabled', 1;  
RECONFIGURE;  
  
ALTER DATABASE SourceDatabase SET TRUSTWORTHY ON;
Run Code Online (Sandbox Code Playgroud)

第二个选项,禁用严格安全性

EXEC sp_configure 'clr enabled', 1;  
RECONFIGURE;  
  
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'clr strict security', 0;
RECONFIGURE;
Run Code Online (Sandbox Code Playgroud)

第三个选项,使用密钥或证书对程序集进行签名

Seems complicated and I was not able to manage that yet. I will appreciate the instructions, because the workflow is not clear here.
Run Code Online (Sandbox Code Playgroud)

第四个选项,使用sp_add_trusted_assembly

EXEC sp_configure 'clr enabled', 1;  
RECONFIGURE;

declare @assembly varbinary(max) = 0x4D5A90000300000004000000FFFF0000... -- …
Run Code Online (Sandbox Code Playgroud)

deployment sql-clr ssdt sql-server-2017

5
推荐指数
1
解决办法
7764
查看次数

没有命名空间的查询 XML

我可以查询 XML,它定义了带有公共表表达式的xmlns标记

DECLARE @XML XML

SET @XML = 
'<NodeA xmlns="https://XYZ.xsd">
<NodeB verzePis="">
    <NodeC1 attrA="Hello" />
    <NodeC2 attrA="World" />
  </NodeB>
</NodeA>
'

;WITH XMLNAMESPACES(DEFAULT 'https://XYZ.xsd')

    SELECT
        r.value('fn:local-name(.)', 'nvarchar(50)') as SectionName,
        r.value('@attrA','NVARCHAR(250)') attrA
    FROM    @XML.nodes('/NodeA/NodeB/*') AS t(r);
Run Code Online (Sandbox Code Playgroud)

但是如果源 XML 不包含任何 xmlns 标记呢?如何解决缺少命名空间的问题?

xml sql-server sql-server-2008-r2

3
推荐指数
1
解决办法
4254
查看次数

带有 XML 参数的 CLR 过程返回根级别的数据无效。线路 1,位置 1

我有以下 CLR 存储过程,该过程在此命令上引发错误

xmlDoc.LoadXml(inputXml);
Run Code Online (Sandbox Code Playgroud)

代码

    public static int spGetTaxOfficeXML(SqlXml _inputXml)
    {
        // this procedure rename Row elements name with NodeName attribute value
        string inputXml = _inputXml.ToString();
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(inputXml);

// procedure Logic

        SqlContext.Pipe.Send(inputXml);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

当 XML 文本作为文本位于 Visual Studio 内的变量内部时,效果很好。但是当我将代码作为 CLR 上传到 SQL Server 并尝试从 SQL Management Studio 执行它时:

DECLARE @XML XML
SET @XML = '<NodeA><NodeB></NodeB><NodeC AttributeX=""><Row NodeName="RowA" AttributeA="" AttributeB="abcd" AttributeC="efgh" /><Row NodeName="RowB" AttributeA="wxyz" /><Row NodeName="RowC" AttributeB="qwer" AttributeC="tyui" /><Row NodeName="RowD" AttributeA="stuv" AttributeB="erty" AttributeC="fghj" /></NodeC></NodeA>'

EXEC …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 xml sql-server c# sql-clr

3
推荐指数
1
解决办法
2073
查看次数

sys.dm_exec_describe_first_result_set 返回错误的数据类型

我有两个与链接服务器连接的 SQL Server 2016。当我sys.dm_exec_describe_first_result_set从远程服务器查询时,它返回列表的数字数据类型而不是十进制。

第一个查询(从远程服务器执行)

select * from sys.dm_exec_describe_first_result_set (N'select top 1 * from LinkedServerFoo.DatabaseFoo.dbo.TargetTable', NULL, 0) [source]
Run Code Online (Sandbox Code Playgroud)

第二个查询(从sql server执行)

select * from sys.dm_exec_describe_first_result_set (N'select top 1 * from DatabaseFoo.dbo.TargetTable', NULL, 0) [source]
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

这对我来说是一个问题,因为我根据这些查询的输出来比较数据类型。

知道可能出现什么问题吗?为什么会这样以及如何解决?

  • smalldatetimewhere sys 表错误返回也存在同样的问题datetime

t-sql system-tables sql-server-2016

3
推荐指数
1
解决办法
277
查看次数