标签: t-sql

在函数中无效使用副作用运算符“INSERT” - 在函数中多次插入

如果这不是正确的论坛,请让我知道并为我移动它。

我刚刚在标量函数的末尾有一堆这样的插入:

   INSERT INTO [Raptor].[dbo].[UserRole]
           ([RoleId]
           ,[UserId])
     VALUES
           (3
           ,@NewUserID)

    INSERT INTO [Raptor].[dbo].[UserRole]
               ([RoleId]
               ,[UserId])
         VALUES
               (5
               ,@NewUserID)
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql functions

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

有效地重建聚集索引

在测试数据库中,我希望:

  • 删除聚集索引(它们是对我们来说超级无用的行上的主键聚集约束。)
  • 创建新的聚集索引
  • 重新创建主键约束作为非聚集索引
  • 重建所有其他非聚集索引。

我的工作流程也是如此,在删除聚集索引之前添加了禁用所有非聚集索引。

由于删除聚集约束索引需要将表保存为 HEAP,因此此过程在我们的 45m 行表上花费的时间是巨大的。约束的下降一直持续到 1:17:00,似乎只有大约 31m(基于会话的 Spotlight 中的逻辑读取)。

有没有更有效的方法来处理这个工作流程?也许是一种删除约束索引并重建为新聚集索引而不是 HEAP 的方法?

谢谢,韦斯

DDL 语句:

表结构

    CREATE TABLE [dbo].[hist](
    [prrowid] [varchar](36) NOT NULL,
    [part] [varchar](30) NULL,
    [date] [datetime] NULL,
    [per_date] [datetime] NULL,
    [type] [varchar](80) NULL,
    [loc] [varchar](80) NULL,
    [loc_begin] [decimal](28, 10) NULL,
    [begin_qoh] [decimal](28, 10) NULL,
    [qty_req] [decimal](28, 10) NULL,
    [qty_chg] [decimal](28, 10) NULL,
    [qty_short] [decimal](28, 10) NULL,
    [um] [varchar](30) NULL,
    [last_date] [datetime] NULL,
    [nbr] [varchar](30) NULL,
    [so_job] [varchar](80) NULL,
    [ship_type] [varchar](30) NULL,
    [addr] [varchar](80) …
Run Code Online (Sandbox Code Playgroud)

index sql-server clustered-index t-sql sql-server-2014

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

为 EmpName 返回一行

我的表中可能有也可能没有相同的员工姓名。问题是我无法知道 Table1 是否会包含更多名称,或者 Table2 是否会包含更多名称,所以我认为联合可以解决这个问题。但是,正如您在下面的语法中看到的那样,它会生成“C”的行,因为它存在于两个表中。这是我想要的输出

empName | TotalSW | TotalSNT  
--------+---------+---------
A       |       1 |       0
B       |       1 |       0
C       |       1 |       1
x       |       0 |       1
z       |       0 |       1
Run Code Online (Sandbox Code Playgroud)

使用下面的 DDL 如何编写查询以生成此输出?

Create Table #Test1
(empName varchar(100), swas varchar(100))

Create Table #Test2
(empName varchar(100), swont varchar(100))

Insert Into #Test1 (empName, swas) VALUES
('A', 'res1'), ('B', 'tim1'), ('C', 'run34')

Insert Into #Test2 (empName, swont) VALUES
('C', 'er12'), ('z', 'nn12'), ('x', '23rw')


Select empName, TotalSW …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

5
推荐指数
2
解决办法
130
查看次数

需要关于备份策略的建议

我们的客户已同意一天数据丢失的 RPO。所以我将改变备份策略以消除空间限制。

数据库处于完全恢复模式。

现有的备份计划:-

  1. 我们每天对数据库进行一次完整备份。

想改变如下: -

  1. 每周,在周日或周六,我们都会对数据库进行完整备份。
  2. 并计划每天对​​数据库进行一次事务备份或差异备份。

这将避免我的空间限制。

如果我们备份事务日志,那么 RTO 会不会更大,因为我们每天只备份一个事务?

无论如何,我们需要执行事务日志备份以在日志文件中腾出空间。

那么你能建议哪种备份类型会更好,差异或事务日志?

如果我走错了方向,请根据我的 RPO 建议一个备份策略。

谢谢。

sql-server backup t-sql restore sql-server-2012

5
推荐指数
2
解决办法
944
查看次数

如何识别哪些 SSIS 包使用给定的环境变量?

我怀疑我今天的 Google 技能不够,但我正在寻找一个快速的 TSQL 脚本,该脚本将识别包存储中使用给定环境变量名称的所有 SSIS 包。

例如,当我配置一个包并查看 Paramaters 页面时,我可以选择一个给定的环境变量。在以下屏幕截图中,我关注的环境变量名为SMTP。我想找到所有使用这个环境变量的包,这样我就可以在进行任何大规模更改之前进行一些调查/测试。

在此处输入图片说明

如果有人有现成的脚本,我将不胜感激,如果你能发布它,否则我会在编码后发布一些东西。

谢谢!

sql-server ssis t-sql

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

在 SQL Server 脚本中的 SELECT 末尾使用 X?

我对 T-SQL 比较陌生,在查看我的前辈脚本时,我发现了一条我无法解析的行。自己去查查是一件很困难的事情。希望指教。

这条线出现在 WHILE 循环内,但我认为这并不重要。我相信从功能上讲,这是从共享 ID 的几行中的一列中收集值,并将它们用逗号连接到 1 个字段中。但我不知道这叫什么,也不知道如何查找以供自己使用。

这个'x'最后在做什么?谁能给我指点这方面的信息?

(select @invtid = coalesce(@invtid + ',',' ')+rtrim(RoleID) 
FROM (
    Select distinct roleid 
    from UserAccounts 
    WHERE CustID = @custID
     )
 x)
Run Code Online (Sandbox Code Playgroud)

谢谢。

sql-server scripting t-sql

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

从系统日志中恢复存储过程的参数

我正在尝试调试一个应用程序,我想在处理代码之前排除数据库错误。

我知道哪个存储过程负责处理我正在查看的数据,但是在此数据库上没有设置日志记录或任​​何跟踪。有没有办法使用现有的系统日志恢复传递给该过程的参数?

我看: dm_exec_procedure_statsfn_dblog,但他们似乎并没有把我需要什么。

我正在设置日志记录。

sql-server ssms t-sql

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

规模与精度 - 为什么这个定义?

来自关于 T-SQL/SQL Server的 Microsoft文档

精度是数字中的位数。小数位数是数字中小数点右侧的位数。例如,数字 123.45 的精度为 5,小数位数为 2。

对于天真的非专家(=我)来说,这总是有点令人困惑。我本来以为反过来的。

  • 如何在总位数涉及到的日常概念精度(如何“精确”的东西是衡量)?
  • 我怎么能想到的小数位数来讲规模(“大”的东西是如何)?

需要明确的是:这不是伪装成问题的咆哮,而不仅仅是好奇。我相信这个术语有很好的理由,我认为我可以通过理解这里的底层思想来了解数据库。(如果认为这个问题在这里太基本了,我理解。)

sql-server datatypes terminology t-sql

5
推荐指数
2
解决办法
4171
查看次数

即使引号转义,也可以通过 .NET 进行 Microsoft SQL Server SQL 注入

我一直在阅读 SQL 注入,作为对相当大的 Web 服务进行安全审计的一部分。我一直在谷歌搜索并阅读我可以在这里和 SO 上找到的所有帖子,并且对真正应该如何构建动态查询以及 MySQL 和 MSSQL 之间的一些差异有相当深入的了解。我最终看到了今年早些时候由 Microsoft 发布的名为SQL Injection 的页面。在标题为“过滤输入”的部分中,它指出:

通过删除转义字符,过滤输入也可能有助于防止 SQL 注入。但是,由于可能会出现问题的字符数量众多,因此这不是可靠的防御。以下示例搜索字符串定界符。

private string SafeSqlLiteral(string inputSQL)  
{  
  return inputSQL.Replace("'", "''");  
}  
Run Code Online (Sandbox Code Playgroud)

编写安全代码第二版也在第 401-402 页讨论了这一点,但看起来作者实际上并没有尝试 C# 示例(或者他在 2003 年使用的 SQL 版本可能没有正确处理转义字符串)。它指出字符串输入将导致无效查询(实际上,转义只是查询其中带有单引号的值),然后指出它也可能会被使用未加引号的数字字段的值攻击(尽管不能,因为示例中的字段来自类型为 的局部变量int,它不可能包含注入所需的信息)。

我不怀疑这里存在可能的攻击向量,但我无法找到有关如何实现这一点的任何解释。从我的其他研究来看,一种可能的方法可能涉及非 Unicode 字符串中的奇怪字节序列。就我而言,我正在使用 .NET,所以不可能有这样的序列,我认为 ADO.NET、SQL Server 或两者都可以正确处理 Unicode 字符串与单个内部的任何其他类型的字符-引号。(虽然有趣的是示例代码似乎是在 C# 中)。

我也很清楚微软页面上列出的其他 SQL 注入方法,对于这个问题,我并不担心这些。此外,我只关心此处正确键入的字符串文字输入。此代码始终在编写 SQL 查询之前将传入类型解析为其适当的运行时类型,因此引号转义仅适用于数据是文字字符串数据时。所以就我而言,该函数实际上更像是:

private string SafeSqlStringLiteral(string inputString)  
{  
  return "'" + inputString.Replace("'", "''") + "'";  
}  
Run Code Online (Sandbox Code Playgroud)

我最关心的就是文档中的下面这句话:

但是,由于可能会出现问题的字符数量众多,因此这不是可靠的防御。

这只是指奇怪的单字节编码,还是有适用于的 Unicode 字符(我无法以编程方式找到一个)?

我正在审查的代码非常广泛,并且在很多地方都使用了这种类型的转义(并且以一种不容易修复的方式)。我不是直接要求利用漏洞(这对 IIRC …

sql-server sql-injection t-sql sql-server-2012

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

用提供的列表中的一个字符串替换 NULL 值

我试图通过使用 SELECT 和我提供给编译器的集合中的一个(随机?)字符串来替换表中的 NULL 值。

例子:

|id | date |
+---+------+    
| 1 | 2017 |
| 2 | NULL |
| 3 | NULL |
Run Code Online (Sandbox Code Playgroud)

我希望NULL值是“2015”、“2012”等,从我指定的集合中随机获取。

不幸的是,COALESCE只返回第一个非空值,而不是指定的值。是否有一些功能,如:

IF column_value = 'NULL (or something)' THEN RAND(string1, string2, string3, string4).
Run Code Online (Sandbox Code Playgroud)

提前致谢。

null sql-server ssms t-sql

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