小编Mar*_*lli的帖子

哪些 SET 选项会影响计划重用以及如何在 T-SQL 中获取它们的值?

当存储过程在任何时候从管理工作室运行良好时,我正在对这种情况进行故障排除,但即使对于相同的参数,相同的存储过程在其中一个网络服务器中运行得非常糟糕。可能有一些原因导致这种情况,包括阻塞等。

我想排除使用不同 SET 选项创建 2 个不同计划的可能性,并且这些计划中至少有一个使用产生错误计划的参数组合进行了优化。

引用本杰明·内瓦雷斯:

“一般来说,查询优化是一个代价高昂的操作,为了避免这种优化成本,计划缓存会尽量将生成的执行计划保存在内存中,以便它们可以被重用。但是,如果一个新的连接运行相同的存储过程有不同的SET选项,它可能会生成一个新的计划……”

为了解决这个问题,我想要一个 T-SQL 查询,它会显示为会话设置的所有值。

这可能吗?

以下 SET 选项将影响执行计划的重用:

(他们中的一些)

DATEFORMAT
LANGUAGE
NUMERIC_ROUNDABORT
FORCEPLAN

performance sql-server optimization plan-cache sql-server-2014 query-performance

0
推荐指数
1
解决办法
239
查看次数

REPLACE 和 CONVERT 的结果是一个 VARCHAR(8000) - 我怎么能得到一个 VARCHAR(50) 作为结果呢?

我有很多情况需要将带有许多小数位的大浮点数转换为带有 2、1 或根本没有小数位的四舍五入数字。

我一直在这样做的方式如下所示:

declare @t table ( [rows] float )


insert into @t 
select 1.344
union all select 32.3577
union all select 65.345
union all select 12.568
union all select 12.4333

select * from @t
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

现在我将进行转换并将它们全部保存到临时表中,然后我们将查看临时表的结构。

begin try
   drop table #radhe
end try
begin catch
end catch


select 
[Rows Formated] = REPLACE(CONVERT(VARCHAR(50),CAST(sp.[Rows] AS MONEY),1), '.00','')
into #radhe
from @t sp


select * 
from #radhe
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

一切都很好,效果很好,它做了我想要的,但是,当我查看表的结构时,我得到以下信息:

use tempdb
go

sp_help '#radhe'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您可以在图片上看到 varchar(8000)。我们可以避免吗?

我会很高兴使用 varchar(50)

sql-server varchar type-conversion floating-point sql-server-2014

0
推荐指数
1
解决办法
3850
查看次数

如何在此存储过程中添加选项(重新编译)?

在我现在的环境中,我有很多存储过程的实例,就像下图所示的那样,将一堆参数传递给过程,然后在过程select exists中运行a ,并根据结果运行不同的逻辑路径在存储过程中。

我对以下程序有几个问题:

1)它是参数嗅探的好选择吗?

2)我怎么能option(recompile)在代码中添加?

在代码中添加选项(重新编译)与使用重新编译创建存储过程之间存在差异。

option(recompile)如果可能的话,我会更热衷于。

ALTER PROCEDURE [dbo].[usp_upd_activity]
                    @activityId             INT,
                    @title                  VARCHAR(100), 
                    @description            VARCHAR(MAX),
                    @inclusions             VARCHAR(MAX),
                    @locationId             INT,
                    @imageUriMain           VARCHAR(255),
                    @uploadToBucket         VARCHAR(200),
                    @path                   VARCHAR(200)
AS
BEGIN

    SET NOCOUNT ON;

    BEGIN TRAN 
    BEGIN TRY

        DECLARE @documentId INT

        IF NOT EXISTS (SELECT 1
                         FROM document 
                        WHERE activityId    = @activityId)
        BEGIN
            INSERT INTO  document 
                        (   [uploadToBucket], [path], [activityId])
            VALUES      (@uploadToBucket, @path, @activityId)

            SET @documentId = SCOPE_IDENTITY();


        END
        ELSE
        BEGIN
            UPDATE  document
            SET     uploadToBucket  = @uploadToBucket, …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures optimization sql-server-2016 parameter-sniffing

0
推荐指数
1
解决办法
1614
查看次数

在数据库中添加新列的正确方法

当我们向现有表中添加新列时,正确的方法是什么?

例如,我已经有像 Foo1、Foo2、Bar1、Bar2 这样的列。现在我想添加一个名为 Foo3 的新列。

当我想添加具有相似名称的列时,标准方法是什么(如果是这样的话)?

我看到 2 个选择:

  1. 创建具有新结构的临时表,其中新列位于同名列的旁边,将数据从现有表复制到新表并删除现有表并重命名临时表。有点复杂的过程,但使数据库字段更具可读性。
  2. 最后添加新列。操作更简单。但是列名如果放在最后可能不会被清楚地理解。

为了获得一些参考,我们正在使用数据库项目来控制数据库更改,并为应用程序开发人员提供更好的 GUI 以进行数据库更改。我们使用某种 ORM 与数据库交互,因此没有人使用数据库对象名称查询数据库。

更新: 我在一些现有列上有几个索引。但是名称相似的列(包括我想添加的列)不属于任何索引。

index source-control database-design sql-server table

0
推荐指数
1
解决办法
235
查看次数

IF 语句的问题

我遇到了这个存储过程的问题。当用户选择“是”时,它应该按照它在“是”的 if 语句中所说的那样做,但它什么也不做,也不向数据库中插入任何内容。它适用于“否”条件。你能告诉我什么不起作用吗?

ALTER PROCEDURE [dbo].[sp_ff_Insert_ProjectApproved]
(

        @project_no varchar(6)
       ,@sequence_no int
       ,@grant_programme varchar(2)
       ,@jobs_approved int
       ,@grant_amount int
       ,@Committee varchar(4)
       ,@Meeting_no int
       ,@Minute_Item int
       ,@jobs_maintained int
       ,@approval_date date
       ,@approval_by int
       ,@comments varchar(1600)
       ,@created_by int
       ,@created_date datetime
       ,@updated_by int
       ,@updated_date datetime
       ,@approval varchar(5)
       ,@ratify varchar(3)




       --,@research_type varchar(1)='T'
)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from


DECLARE @ReturnValue int,
        @post_approval_status varchar(3),
        @approval_status varchar(3),
        @current_status varchar(3)  

set @current_status = ( SELECT approval_status from approval_master_tbl
         WHERE project_no = @project_no …
Run Code Online (Sandbox Code Playgroud)

null sql-server t-sql

0
推荐指数
1
解决办法
52
查看次数