标签: stored-procedures

慢速 UDF 的 SQL 替代方案

具有两个 UDT 参数的查询需要 0.3 秒,但是当封装在内联表值函数中时,需要 3.5 秒以上。

我读过(为什么 UDF 比子查询慢这么多?),但正在努力解决如何修复/重写。

根据下面@JasonALong 的反馈,

0.3 秒内完成的 SELECT 语句的执行计划: https://www.brentozar.com/pastetheplan/? id=HJnrqC53Z(请注意,此页面上提供了 SQL)。

下面粘贴了在 3.5 秒内完成的函数代码以及此链接中的执行计划:https://www.brentozar.com/pastetheplan/ ?id=BJZbqR93b

SELECT
SelectedContracts.MeasurableID,
SelectedContracts.EntityID,

EntityName,
EntityAbbrev,
EntityLogoURL,
EntityHex1,
EntityHex2,
EntitySportID,

MeasurableName,
MeasurableOrganizationID,
YearFilter,
SeasonFilter,
CategoryFilter,
ResultFilter,
Logo4Result,
MeasurableSportID,
MouseoverFooter,
ContractRank4Org,
ContractEndUTC,

HighContractPrice4Period,
HighTradeID,
HighTradeUTC,
HighTradeNumberOfContracts,
HighTradeCurrency,

LowContractPrice4Period,
LowTradeID,
LowTradeUTC,
LowTradeNumberOfContracts,
LowTradeCurrency,

LastTradePrice,
LastTradeID,
LastTradeUTC,
LastTradeNumberOfContracts,
LastTradeCurrency,

SecondLastTradePrice,
SecondLastTradeID,
SecondLastTradeUTC,
SecondLastTradeNumberOfContracts,
SecondLastTradeCurrency,

ContractPrice4ChangeCalc,
ContractID4ChangeCalc,
ContractUTC4ChangeCalc,
ContractsNumberTraded4ChangeCalc,
ContractCurrency4ChangeCalc,

HighestBidID,
HighestBidMemberID,
HighestBidPrice,
HighestBidAvailableContracts,
HighestBidCurrency,

LowestAskID,
LowestAskMemberID,
LowestAskPrice,
LowestAskAvailableContracts, …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures user-defined-functions user-defined-types

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

将 nvarchar 值转换为数据类型 int 时转换失败

我有两个返回数据的存储过程:

ALTER proc [dbo].[spBuscarUrl]
@CodigoContrato nvarchar(255),  
@url nvarchar(255) OUTPUT  
AS    

    SET NOCOUNT ON;  
    SELECT @url = url  
    FROM v_compras_y_contrataciones AS cc  
    WHERE CodigoContrato = @CodigoContrato;  
RETURN  
Run Code Online (Sandbox Code Playgroud)

当我尝试返回第二个存储过程的值时,错误显示:

ALTER procedure [dbo].[spCaller]
AS BEGIN
DECLARE @URL nvarchar(255);  
EXECUTE spBuscarUrl  
    'MIREX-2017-00001', @url = @URL OUTPUT;  
RETURN convert(nvarchar(255),@URL);  
END
Run Code Online (Sandbox Code Playgroud)

消息 245,级别 16,状态 1,过程 spCaller,第 6 行 转换 nvarchar 值时转换失败 ' https://comunidad.comprasdominicana.gob.do//Public/Tendering/OpportunityDetail/Index?noticeUID=DO1.NTC.2 ' 转换为数据类型 int。

sql sql-server stored-procedures

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

存储过程在多个 SQL 数据库上返回不同顺序的输出

我有一个存储过程(称为sp1),它正在两个表之间进行联接。

表的架构如下:

Table1 (id, country, name, ccy)
Table2 (sId, price)
Run Code Online (Sandbox Code Playgroud)

这是存储过程:

SELECT
    RTRIM(id) as id,
    country
FROM
    dbo.Table1 
LEFT OUTER JOIN
    dbo.Table2 ON Table1.Id = Table2.sId
Run Code Online (Sandbox Code Playgroud)

在一个数据库上,我得到以下结果

MNKD US     UnitedStates
928502811   UnitedStates
Run Code Online (Sandbox Code Playgroud)

但在另一个数据库上,我得到了不同顺序的结果:

928502811   UnitedStates
MNKD US     UnitedStates
Run Code Online (Sandbox Code Playgroud)

唯一显着的区别是表 1 由许多列组成,而表 2 只有两列。

有人可以帮助我找出原因以及如何修复它以获得一致的结果吗?谢谢

sql sql-server stored-procedures

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

从 C# 应用程序动态调用 SQL Server 存储过程

我有一个类 ( dbConnections),其中包含处理数据库查询类型的方法。我想调用此类中的方法,传递过程名称和包含该特定调用所需参数的数组。

然而,当执行时,它无法识别已传递​​的任何参数。如果我对它们进行硬编码,它们工作得很好,所以我的循环应用程序显然有问题。

我希望能够重用这个方法来传递和获取不同的参数,我只是不知道应该如何处理它。我还没有处理返回参数,因为我还没有让它工作......

任何见解将不胜感激。

这是我班级中的方法dbConnections

public void ExecuteProcedure(string procedureName, string[] paramName, string[] procParams)
{
        SqlCommand cmd = new SqlCommand(procedureName, con);
        cmd.CommandType = CommandType.StoredProcedure;

        for (int i = 0; i >= paramName.Length; i++)
        {
            cmd.Parameters.AddWithValue(paramName[i], procParams[i]);
        }

        cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

这是一个调用方法:

private void btn_logIn_Click(object sender, EventArgs e)
{          
        string uid = txb_userId.Text;
        string pwd = txb_password.Text;
        string procedureName = "spUsers_Login";
        string[] paramName = new string[2];
        string[] procParams = new string[2];

        paramName[0] = "@Username";
        procParams[0] = uid;
        paramName[1] …
Run Code Online (Sandbox Code Playgroud)

c# sql-server stored-procedures

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

如何优化 Postgres 中存储过程的性能?

我在 Ubuntu 18.04.1 上使用 PostgreSQL 10.9。以下存储过程采用数组作为输入和变量 beta。两个输入变量都用于计算聚合索引。该数组可以具有不同的长度。由于我在另一个查询中使用此函数数千次,因此此函数的性能非常重要。我删除了 CTE 并将其更改为子查询,这有点帮助。但是我找不到任何其他方法来进一步提高性能。

CREATE OR REPLACE FUNCTION public.part_accessibility_index(traveltime_array NUMERIC[], beta numeric)
RETURNS SETOF NUMERIC 

LANGUAGE sql
AS $function$

    SELECT COALESCE(sum_index,0) 
    FROM 
    (
        SELECT sum(part) sum_index
        FROM ( 
            SELECT EXP(UNNEST(traveltime_array)*(beta)) AS part
        )
        index_part 
    )
    sum_index;

$function$
Run Code Online (Sandbox Code Playgroud)

该函数可以这样调用

SELECT part_accessibility_index(ARRAY[100.2,323.9,1323.313,432.232,1100.22,144.1], -0.001)
Run Code Online (Sandbox Code Playgroud)

我得到以下查询计划。

ProjectSet  (cost=0.00..5.27 rows=1000 width=32) (actual time=0.180..0.184 rows=1 loops=1)
  ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.000..0.001 rows=1 loops=1)
Planning time: 0.022 ms
Execution time: 0.197 ms
Run Code Online (Sandbox Code Playgroud)

如前所述,查询并不是很慢,但可能仍有改进的方法。我将非常乐意提供任何帮助!

sql postgresql performance stored-procedures

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

Mysql 生成简单的存储函数

我已经奋斗了大约一个小时,试图让一个简单的存储函数在 mysql 中工作。我做了下面的简单例子,我不确定它有什么问题。

CREATE FUNCTION hello(id INT) 
RETURNS VARCHAR
BEGIN
    RETURN 'Works';
END;

hello(2);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在“BEGIN RETURN 'Works”附近使用的正确语法;END' 在第 3 行

我很确定这是一个“愚蠢”的问题,但我不是一个 sql 专家,并且迫切需要组合一组函数来构建自定义报告

mysql sql stored-procedures stored-functions

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

存储过程的语法错误

USE AdventureWorks2019;
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE OR ALTER PROCEDURE dbo.EmployeeGenderbyJobTitle
AS
BEGIN
    SET NOCOUNT ON;

    DROP TABLE IF EXISTS #EmployeeGenderbyJobTitle
    GO 

    CREATE TABLE #EmployeeGenderbyJobTitle
    (
        EmployeeID int NOT NULL PRIMARY KEY,
        Gender nchar(1),
        JobTitle nvarchar(50)
    )
    GO

    INSERT INTO #EmployeeGenderbyJobTitle (Gender, JobTitle)
        SELECT Gender, JobTitle
        FROM humanresources.employee AS e
    GO

    SELECT COUNT(*) AS FemaleEmployees, JobTitle
    FROM #EmployeeGenderbyJobTitle
    WHERE Gender = 'F' 
    GROUP BY JobTitle
    GO

    SELECT COUNT(*) AS MaleEmployees, JobTitle
    FROM #EmployeeGenderbyJobTitle
    WHERE Gender …
Run Code Online (Sandbox Code Playgroud)

sql sql-server stored-procedures syntax-error

0
推荐指数
2
解决办法
133
查看次数

如何转换查询而不多次调用子查询?

我有这样的疑问:

SELECT
       t.[DataTran]
      ,t.[Dok]
      ,t.[Product]
      ,p.idxbox
      ,po.[Mark]
      ,po.[Model]
      ,(SELECT 
            TOP(1) [poz_La]
        FROM [RaportyAutko].[dbo].[G_API_Data]
        WHERE
            idxbox= p.idxbox 
            AND DATEDIFF(second,{d '1970-01-01'}, [dataandtime])  <  DATEDIFF(second,{d '1970-01-01'},t.[DataTran]) 
            AND  [distance]<>0
        ORDER BY dataandtime DESC) AS [poz_La]
      ,(SELECT 
            TOP(1) [poz_Lo]
        FROM [RaportyAutko].[dbo].[G_API_Data]
        WHERE
            idxbox= p.idxbox 
            AND DATEDIFF(second,{d '1970-01-01'}, [dataandtime])  <  DATEDIFF(second,{d '1970-01-01'},t.[DataTran]) 
            AND  [distance]<>0
        ORDER BY dataandtime DESC) AS [poz_Lo]
      ,(SELECT 
            TOP(1) [adress]
        FROM [RaportyAutko].[dbo].[G_API_Data]
        WHERE
            idxbox= p.idxbox 
            AND DATEDIFF(second,{d '1970-01-01'}, [dataandtime])  <  DATEDIFF(second,{d '1970-01-01'},t.[DataTran]) 
            AND  [distance]<>0
        ORDER BY dataandtime DESC) AS [adress]
      ,
        (SELECT 
            TOP(1) …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server stored-procedures

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

如何使用存储过程在sql中存储图像?

在我的网页图片从文件上传控件中获取,它必须存储在 sql server 中。如何编写存储过程以在 sql server 中保存图像?

sql sql-server asp.net stored-procedures

-1
推荐指数
1
解决办法
9416
查看次数

ORA-1843:更新记录时不是有效月份

我想出于某种目的更新我的日期列.已存储在列中的值如下所示

18-06-14

并且在更新时如果我不更新任何东西并进行调试和检查,则需要格式化为 2014-06-18T00:00:00

因此,在更新时,我在我的程序中得到如下错误.

ORA-1843:不是有效月份

以下是我将其作为更新参数发送的方式

LAUNCH_DATE = P_LAUNCH_DATE,

P_LAUNCH_DATE我有更新的价值观.这给了我上面的错误.我该如何解决它.

UPDATE

这是我整个存储过程中使用它的方式.

PROCEDURE INSERT_INTO_RRSOC_MST
  (    
    P_STORE_CODE IN NVARCHAR2,
    P_STATE IN NVARCHAR2,
    P_CITY IN NVARCHAR2,
    P_SITE_STORE_FORMAT IN NVARCHAR2,
    P_STORE_SITENAME IN NVARCHAR2,
    P_STORE_SITENAME_LANDL_1 IN NVARCHAR2,
    P_STORE_SITENAME_LANDL_2 IN NVARCHAR2,
    P_STORE_ASST_MANAGER_NAME IN NVARCHAR2,
    P_STORE_ASST_MANAGER_MOBNO IN NVARCHAR2,
    P_STORE_MANAGER_NAME IN NVARCHAR2,
    P_MANAGER_MOBNO IN NVARCHAR2,
    P_EMP_NEAREST_STORE IN NVARCHAR2,
    P_EMP_NEAREST_STORE_MOBNO IN NVARCHAR2,
    P_SUPERVISOR_NAME IN NVARCHAR2,
    P_SUPERVISOR_MOBNO IN NVARCHAR2,
    P_SECURITY_SUP_NAME_STORE IN NVARCHAR2,
    P_SECURITY_SUP_MOBNO_STORE IN NVARCHAR2,
    P_NAME_ALIGNED_LPO IN NVARCHAR2,
    P_LPO_MOBILENO IN NVARCHAR2,
    P_ALPM_ALPO_NAME IN NVARCHAR2,
    P_ALPM_ALPO_MOBNO IN …
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures sql-update

-1
推荐指数
1
解决办法
889
查看次数