标签: sql-server

动态SQL(pivot查询)转换为xml输出时,为什么日期的第一位转换为unicode?

我正在使用Bluefeet 的这个很好的例子https://dba.stackexchange.com/a/25818/113298,来创建一个数据透视表并将其转换为 xml 数据。

声明参数

DECLARE @cols AS NVARCHAR(MAX),  @query  AS NVARCHAR(MAX);
Run Code Online (Sandbox Code Playgroud)

接下来有一个代码很多的CTE,CTE的最终结果放在一个临时数据库中(与示例中相同)

SELECT 
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
Run Code Online (Sandbox Code Playgroud)

生成 cols(与示例相同)

SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120)) 
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') 
,1,1,'');
Run Code Online (Sandbox Code Playgroud)

结果集是我应该期望的

set @query = 
   'SELECT [Guid],' + @cols +'
    FROM
    (
        SELECT 
            [StayDate] 
           ,[Guid]
        FROM #tempDates
    ) A
    pivot
    (
        count([StayDate])
        for [StayDate] in (' + @cols +')                    
    ) …
Run Code Online (Sandbox Code Playgroud)

xml sql-server pivot

11
推荐指数
2
解决办法
2983
查看次数

将标识列从 INT 更改为 BIGINT

我有一个带有标识列的表,它也是一个主键。目前,它有 5000 万行,身份列的最高值是 148,921,803。该表有很多DELETEs 并INSERTS在其上执行,因此价值很高。

我们要将数据类型从 更改INTBIGINT以准备添加更多行。请注意,没有对 PK 列的引用。

做到这一点的最佳方法是什么,停机时间最少?我有两个选择。

  1. 删除 PK 并更改列;或者
  2. 复制落重命名方法,描述在这里

sql-server sql-server-2008-r2 identity

11
推荐指数
2
解决办法
3万
查看次数

如何在标准 SQL 或 T-SQL 中生成 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, ... 系列?

给定两个数字nand m,我想生成一系列的形式

1, 2, ..., (n-1), n, n, (n-1), ... 2, 1
Run Code Online (Sandbox Code Playgroud)

并重复它m几次。

例如,对于n = 3and m = 4,我想要以下 24 个数字的序列:

1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1
----------------  ----------------  ----------------  ----------------
Run Code Online (Sandbox Code Playgroud)

我知道如何通过以下两种方法之一在 PostgreSQL 中实现此结果:

使用以下查询,该查询使用该generate_series函数,以及一些确保订单正确的技巧:

WITH parameters (n, m) AS
(
    VALUES (3, 5)
)
SELECT 
    xi
FROM
(
    SELECT
        i, i …
Run Code Online (Sandbox Code Playgroud)

postgresql sql-server t-sql functions

11
推荐指数
4
解决办法
7402
查看次数

使用跨数据库证书时触发器中的权限

我使用跨数据库证书(如 Erland Sommarskog 所述)来控制对我环境中某个数据库的访问(SQL Server 2008 R2)。

我在数据库 A 中存储了更新数据库 B 中表的存储过程。直到现在,这一直适用于 db A 中的各种存储过程和 db B 中的表。我正在尝试更新 db B 中的表,但该表上有一个触发器。此触发器在 db B 的另一个表中插入其他数据。我收到错误消息:

消息 916,级别 14,状态 1,过程 table_trigger,第 11 行 服务器主体“sql\login”在当前安全上下文下无法访问数据库“B”。

我尝试为与证书绑定的数据库 B 用户授予插入权限以插入其他表,但它没有解决错误。除了更改触发器以使其使用之外,我还有其他选择WITH EXECUTE AS OWNER吗?

这是复制问题的 DDL:

CREATE LOGIN [GuggTest] WITH PASSWORD=N'abcd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

CREATE DATABASE A;
CREATE DATABASE B;

USE A;

CREATE TABLE dbo.SPtoUpdate
    (
      ID INT
    , ILoveFishing VARCHAR(255)
    );
INSERT INTO dbo.SPtoUpdate
        ( ID , ILoveFishing )
VALUES  ( …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server permissions signature certificate

11
推荐指数
1
解决办法
2131
查看次数

为什么嵌套循环连接只支持左连接?

在 Craig Freedman 的博客Nested Loops Join 中,他解释了为什么嵌套循环联接不能支持右外联接

问题是我们多次扫描内表——外连接的每一行扫描一次。在这些多次扫描期间,我们可能会多次遇到相同的内部行。在什么时候我们可以得出结论,特定的内部行没有或不会加入?

有人可以用一种非常简单和有教育意义的方式解释一下吗?

这是否意味着循环从外表 ( R1) 开始并扫描内表 ( R2)?

我知道对于R1不与 连接的值,R2应将其替换为 aNULL以便结果集变为 ( NULL, R2)。对我来说,R2R1不加入时似乎不可能返回一个值,因为它不知道R2要返回哪个值。但这不是它的解释方式。或者是吗?

SQL Server会在事实上优化(经常替换)RIGHT JOINLEFT JOIN,但问题是解释为什么它在技术上是不可能的NESTED LOOPS JOIN使用/支持RIGHT JOIN逻辑。

join sql-server database-internals

11
推荐指数
2
解决办法
1525
查看次数

如何将 HTML 代码读取为 XML 并像 sql 中的示例一样获得输出?

我在数据库中存储了 HTML 代码,我想将其作为 XML 读取。

我的代码:

http://rextester.com/RMEHO89992

这是我拥有的 HTML 代码示例:

<div>
  <section>
       <h4>
         <span> A </span>
        </h4>
        <ul>
           <li>
              <span> Ab</span>
                     AD
              <span> AC </span>
           </li>
           <li>
              <span> Ag</span>
              <span> AL </span>
           </li>
        </ul>
        <h4>
              <span> B </span>
       </h4>
       <ul>
           <li>
              <span> Bb</span>
                     BD
              <span> BC </span>
           </li>
           <li>
              <span> Bg</span>
              <span> BL </span>
           </li>
        </ul>
   </section>
</div>
Run Code Online (Sandbox Code Playgroud)

这是我需要的输出示例:

Category         Selection        Value                    
---------        ---------        ------------             
A                Ab               AD                  
A                Ag               AL                       
B                Bb               BD                   
B                Bg               BL                       
Run Code Online (Sandbox Code Playgroud)

我需要将<h4>标签内的值作为 …

xml sql-server t-sql

11
推荐指数
2
解决办法
3855
查看次数

如何检查我有权运行查询的数据库服务器上安装了什么数据库引擎?

我想检查我可以访问的 Datasase 服务器上正在运行什么类型的 sql。我只能访问 Web 界面和表格列表。

通过该界面,我可以对列表中的表运行查询。

如何获取有关服务器和服务器正在运行的版本的更多信息。我不知道服务器正在运行的 IP 或端口。

我想知道服务器是 MySQL、Mircosoft SQL Server、Oracle SQL、Postgre SQL 还是其他 sql server。

我正在谈论的网站是这个: w3schools.com SQL editor

编辑 2:虽然对于某些命令 select sqlite_version() 对我有用,但它不起作用。这是响应的屏幕截图。

在此处输入图片说明

编辑 3:在 Chromium 浏览器上,命令工作正常。但是在 Firefox 浏览器上,该命令不起作用。

我还提到我正在运行 Linux。

您认为在 Firefox 和 Chrome 上我得到不同结果的原因可能是什么?

mysql postgresql sqlite sql-server database-engine

11
推荐指数
4
解决办法
6290
查看次数

SQL Server 查询计划 XML:QueryPlanHash 长度

更新:这绝对是一个错误。有关完整详细信息,请参阅此连接项

在测试sp_BlitzCache 的一些更改(完全公开,我是作者之一)时,我发现了我认为是我们代码中的错误。

在某一时刻,我们匹配查询计划哈希以获得查询成本。我们这样做:

statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) =
    xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float')
Run Code Online (Sandbox Code Playgroud)

就我所见,这已经奏效了。然而,在一个奇怪的情况下,XML 中的子字符串抛出一个NULL值,并且计划显示成本为 0,尽管它相当高。

深入研究执行计划(完全公开,我为托管 Paste The Plan 的公司工作),我注意到一个问题哈希的查询计划哈希长度为 17 个字符,而其余为 18 个字符。以下是示例:

QueryPlanHash="0x4410B0CA640CDA89"
QueryPlanHash="0x2262FEA4CE645569" 
QueryPlanHash="0xED4F225CC0E97E5" -- 问题!
QueryPlanHash="0xBF878EEE6DB955EA"
QueryPlanHash="0x263B53BC8C14A452"
QueryPlanHash="0x89F5F146CF4B476F"
QueryPlanHash="0xEF47EA40805C8961"
QueryPlanHash="0xB7BE27D6E43677A5"
QueryPlanHash="0x815C54EC43A6A6E9"

查询计划哈希上市BINARY 8-想必这应该是相同的长度,但到底是什么像我这样的人了解二进制值?

稍微使用 XQuery,我发现通过将子字符串更改为从第二个位置开始,它会得出一个有效(尽管不正确)的哈希值。

WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
SELECT   
        QueryPlanCost = statement.value('sum(/p:StmtSimple/@StatementSubTreeCost)', 'float'),
        **q.n.value('substring(@QueryPlanHash, 2)', 'BINARY(8)')**
FROM    #statements s
CROSS APPLY s.statement.nodes('/p:StmtSimple') AS q(n)
OPTION(RECOMPILE);

WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
SELECT   
        QueryPlanCost = statement.value('sum(/p:StmtSimple/@StatementSubTreeCost)', 'float'),
        **q.n.value('substring(@QueryPlanHash, …
Run Code Online (Sandbox Code Playgroud)

xml sql-server datatypes execution-plan

11
推荐指数
1
解决办法
480
查看次数

SQL Spec 是否需要在 EXISTS() 中使用 GROUP BY

Microsoft 当前允许使用此语法。

SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
  SELECT *
  FROM ( VALUES (1),(1) )
    AS t(x)
  WHERE g.x = t.x
  HAVING count(*) > 1
);
Run Code Online (Sandbox Code Playgroud)

请注意,没有GROUP BYEXISTS条款,是有效的ANSI SQL。或者它只是暴露了一个实现细节。

作为参考,PostgreSQL 中不允许使用相同的语法。

错误:列“tx”必须出现在 GROUP BY 子句中或用于聚合函数中

但是这种语法是允许的..

SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
  SELECT 1  -- This changed from the first query
  FROM ( VALUES (1),(1) )
    AS t(x)
  WHERE g.x = t.x
  HAVING count(*) …
Run Code Online (Sandbox Code Playgroud)

postgresql sql-server group-by sql-standard exists

11
推荐指数
1
解决办法
2438
查看次数

SQL Server 查询存储是否捕获参数值?

SQL Server 2016 中引入的新查询存储很棒。它很好地替代了我以前使用旧的 Profiler 工具所做的大部分工作。但是,我还没有找到一种方法来捕获与对它嗅出的高资源消耗查询的单个调用相关联的参数值。这可能吗?

我知道查询存储更多地处理聚合数据而不是单个调用,所以我怀疑我在这里可能不走运。当我发现一个缓慢的查询时,我发现将参数与其最慢的调用之一关联起来也很方便进行故障排除。我想知道如何使用最新最好的工具来做到这一点。(我不会错过使用 Profiler!)

在安全方面,查询存储比 Profiler 更容易锁定吗?我认为它需要从某个级别的单个调用中捕获数据才能计算聚合。只是不确定它是否存储了其中的任何一个。

performance sql-server sql-server-2016 query-store query-performance

11
推荐指数
1
解决办法
1728
查看次数