标签: stored-procedures

将SQL保存在存储过程与代码中的优缺点是什么

在您的C#源代码或存储过程中保留SQL有哪些优点/缺点?我一直在与一位朋友讨论我们正在开发的一个开源项目(C#ASP.NET论坛).目前,大多数数据库访问都是通过在C#中构建SQL内联并调用SQL Server DB来完成的.所以我试图确定哪个特定项目最好.

到目前为止,我有:

代码中的优点:

  • 易于维护 - 无需运行SQL脚本来更新查询
  • 更容易移植到另一个数据库 - 没有移动到端口

存储过程的优点:

  • 性能
  • 安全

c# sql sql-server stored-procedures

274
推荐指数
17
解决办法
7万
查看次数

如何在创建存储过程之前检查存储过程是否存在

我有一个SQL脚本,每次客户端执行"数据库管理"功能时都必须运行该脚本.该脚本包括在客户端数据库上创建存储过程.其中一些客户端在运行脚本时可能已经有了存储过程,有些可能没有.我需要将缺少的存储过程添加到客户端数据库中,但是我尝试弯曲T-SQL语法并不重要,我得到了

CREATE/ALTER PROCEDURE'必须是查询批处理中的第一个语句

在创作作品之前我已经读到了它,但我不喜欢这样做.

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO

CREATE PROCEDURE MyProc
...
Run Code Online (Sandbox Code Playgroud)

如何添加检查存储过程是否存在并创建它(如果它不存在)但如果存在则更改它?

sql t-sql sql-server stored-procedures

266
推荐指数
10
解决办法
50万
查看次数

如何在实体框架6(代码优先)中调用存储过程?

我是Entity Framework 6的新手,我想在我的项目中实现存储过程.我有一个存储过程如下:

ALTER PROCEDURE [dbo].[insert_department]
    @Name [varchar](100)
AS
BEGIN
    INSERT [dbo].[Departments]([Name])
    VALUES (@Name)

    DECLARE @DeptId int

    SELECT @DeptId = [DeptId]
    FROM [dbo].[Departments]
    WHERE @@ROWCOUNT > 0 AND [DeptId] = SCOPE_IDENTITY()

    SELECT t0.[DeptId]
    FROM [dbo].[Departments] AS t0
    WHERE @@ROWCOUNT > 0 AND t0.[DeptId] = @DeptId
END
Run Code Online (Sandbox Code Playgroud)

Department 类:

public class Department
{
    public int DepartmentId { get; set; }       
    public string Name { get; set; }
}

modelBuilder 
.Entity<Department>() 
.MapToStoredProcedures(s => 
s.Update(u => u.HasName("modify_department") 
               .Parameter(b => b.Department, "department_id") 
               .Parameter(b => …
Run Code Online (Sandbox Code Playgroud)

c# stored-procedures entity-framework

253
推荐指数
12
解决办法
42万
查看次数

SQL Server:查询速度快,但程序速度慢

查询运行速度很快:

DECLARE @SessionGUID uniqueidentifier
SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908'

SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
Run Code Online (Sandbox Code Playgroud)

子树成本:0.502

但是将相同的SQL放在存储过程中运行速度很慢,并且执行计划完全不同

CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank

EXECUTE ViewOpener @SessionGUID
Run Code Online (Sandbox Code Playgroud)

子树成本:19.2

我跑了

sp_recompile ViewOpener
Run Code Online (Sandbox Code Playgroud)

它仍然运行相同(严重),我也已将存储过程更改为

CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
SELECT *, 'recompile please'
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
Run Code Online (Sandbox Code Playgroud)

然后再回来,试图真正欺骗它重新编译.

我已经删除并重新创建存储过程以使其生成新计划.

我尝试使用一个诱饵变量强制重新编译,并防止参数嗅探:

CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS

DECLARE …
Run Code Online (Sandbox Code Playgroud)

sql-server performance stored-procedures

246
推荐指数
5
解决办法
18万
查看次数

如何在C#程序中执行存储过程

我想从C#程序执行此存储过程.

我在SqlServer查询窗口中编写了以下存储过程并将其保存为stored1:

use master 
go
create procedure dbo.test as

DECLARE @command as varchar(1000), @i int
SET @i = 0
WHILE @i < 5
BEGIN
Print 'I VALUE ' +CONVERT(varchar(20),@i)
EXEC(@command)
SET @i = @i + 1
END
Run Code Online (Sandbox Code Playgroud)

编辑:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace AutomationApp
{
    class Program
    {
        public void RunStoredProc()
        {
            SqlConnection conn = null;
            SqlDataReader rdr  = null;

            Console.WriteLine("\nTop 10 Most Expensive Products:\n");

            try
            {
                conn = new SqlConnection("Server=(local);DataBase=master;Integrated Security=SSPI");
                conn.Open();
                SqlCommand …
Run Code Online (Sandbox Code Playgroud)

c# sql-server stored-procedures

243
推荐指数
7
解决办法
75万
查看次数

使用存储过程检查字符串是否包含SQL Server 2005中的子字符串

我有一根绳子,@mainString = 'CATCH ME IF YOU CAN'.我想检查这个词是否在ME里面@mainString.

如何在SQL中检查字符串是否具有特定的子字符串?

t-sql sql-server string stored-procedures sql-server-2005

231
推荐指数
2
解决办法
63万
查看次数

SQL Server插入(如果不存在)

我想在我的表中插入数据,但只插入我的数据库中不存在的数据!

这是我的代码:

ALTER PROCEDURE [dbo].[EmailsRecebidosInsert]
  (@_DE nvarchar(50),
   @_ASSUNTO nvarchar(50),
   @_DATA nvarchar(30) )
AS
BEGIN
   INSERT INTO EmailsRecebidos (De, Assunto, Data)
   VALUES (@_DE, @_ASSUNTO, @_DATA)
   WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA);
END
Run Code Online (Sandbox Code Playgroud)

错误是:

消息156,级别15,状态1,过程EmailsRecebidosInsert,第11行
关键字'WHERE'附近的语法不正确.

sql sql-server stored-procedures sql-server-2008

205
推荐指数
10
解决办法
49万
查看次数

如何为查询返回的每一行执行一次存储过程?

我有一个以某种方式改变用户数据的存储过程.我传递给它user_id,它确实是这样的.我想在一个表上运行查询,然后对于每个user_id,我发现在该user_id上运行一次存储过程

我该怎么写这个查询?

sql sql-server stored-procedures

197
推荐指数
6
解决办法
27万
查看次数

有没有办法用Dapper调用存储过程?

对于stackoverflow.com 的Dapper Micro ORM的结果我印象非常深刻.我正在考虑我的新项目,但我有一个担心,有时我的项目需要有存储过程,我在网上搜索了很多但没有找到存储过程的任何东西.那么有没有办法让Dapper使用存储过程?

如果可能,请告诉我,否则我必须以我的方式延长它.

.net orm stored-procedures dapper

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

LINQ-to-SQL vs存储过程?

我在StackOverflow(LINQ初学者指南)上看了一下"LINQ 初学者指南",但有一个后续问题:

我们即将推出一个新项目,几乎所有的数据库操作都将是相当简单的数据检索(项目的另一部分已经编写了数据).到目前为止,我们的大多数其他项目都使用存储过程来处理这些事情.但是,如果它更有意义,我想利用LINQ-to-SQL.

所以,问题是:对于简单的数据检索,哪种方法更好,LINQ-to-SQL或存储过程?任何具体的专业人士或骗子?

谢谢.

linq stored-procedures linq-to-sql

187
推荐指数
13
解决办法
10万
查看次数