小编gbn*_*gbn的帖子

存储过程的模式?

是否有任何用于编写存储过程的模式?喜欢:

  1. 我们应该写1个Sp用于更新,1个用于插入,1个用于每个表的选择.
  2. 什么时候创建视图很好.
  3. 如何在SP中管理业务规则?
  4. 如何减少重复代码等.

任何关于这些模式的好文章或书籍......

谢谢

sql t-sql database stored-procedures

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

SQL 2005 sp_GetAppLock ---何时调用sp_ReleaseAppLock?

抱歉,最后一条消息.我对我的问题做了一个粘贴.长问题很简单,当在try/catch块中使用sp_GetAppLock时,是否应该在捕获到异常时调用sp_ReleaseAppLock?


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

BEGIN TRAN 

DECLARE @res INT

EXEC @res = sp_getapplock
           @Resource = 'This a Lock ID 3',
           @LockMode = 'Exclusive', 
           @LockOwner = 'Transaction', 
           @LockTimeout = 60000,
           @DbPrincipal = 'public'

if @res < 0
begin
    declare @errorMessage nvarchar(200)

    set @errorMessage =
             case @res
                 when -1 then 'Applock request timed out.'
                 when -2 then 'Applock request canceled.'
                 when -3 then 'Applock involved in deadlock'
                  else 'Parameter validation or other call error.'endraiserror (@errorMessage,16,1)
             end

 SELECT...
 INSERT...
 UPDATE... …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2005

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

在没有通过TSQL链接的情况下在另一个SQL Server上调用Sproc

我想在TSQL中从服务器A调用服务器B上的sproc而不链接服务器.是否可以使用类似连接字符串的东西来执行此sproc?返回值将是单个nvarchar值.

问候.

sql sql-server linked-server

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

SQL Server - 使用视图而不是触发器时获取插入的记录标识值

对于具有标识字段的多个表,我们在这些视图上使用视图和替代触发器实现行级安全性方案.这是一个简化的示例结构:

-- Table
CREATE TABLE tblItem (
    ItemId int identity(1,1) primary key,
    Name varchar(20)
)
go

-- View
CREATE VIEW vwItem 
AS
    SELECT *
    FROM tblItem
    -- RLS Filtering Condition
go

-- Instead Of Insert Trigger
CREATE TRIGGER IO_vwItem_Insert ON vwItem
INSTEAD OF INSERT
AS BEGIN
    -- RLS Security Checks on inserted Table

    -- Insert Records Into Table
    INSERT INTO tblItem (Name)
    SELECT Name
    FROM inserted;
END
go
Run Code Online (Sandbox Code Playgroud)

如果我想插入记录并获取其身份,在实现RLS而不是触发器之前,我使用了:

DECLARE @ItemId int;

INSERT INTO tblItem (Name)
VALUES ('MyName');

SELECT @ItemId …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server triggers identity

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

在SQL中等效于VB AndAlso?

在SQL(SQL Server 2005)中是否有与VB的AndAlso/ OrElse和C#的&&/相同的功能||.我正在运行类似于以下的选择查询:

SELECT a,b,c,d
FROM table1
WHERE 
(@a IS NULL OR a = @a)
AND (@b IS NULL OR b = @b)
AND (@c IS NULL OR c = @c)
AND (@d IS NULL OR d = @d)
Run Code Online (Sandbox Code Playgroud)

例如,如果将"@a"参数作为NULL传入,则无法评估WHERE子句的第二部分(a = @a).有没有办法通过使用特殊语法或重写查询来避免这种情况?

谢谢,詹姆斯.

sql t-sql sql-server sql-server-2005 short-circuiting

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

SQL Server 2005阻止问题(ASYNC_NETWORK_IO)

我负责在IIS和SQL Server 2005上运行的第三方应用程序(无法访问源)(500个并发用户,1TB数据,8个IIS服务器).我们最近开始看到对数据库的严重阻塞(在生产中运行此应用程序几个月后没有问题).这种情况在白天以大约每30分钟的随机间隔发生,每次影响20到100次.所有会话最终都会使应用程序超时并且会话中止.

问题消失,然后逐渐重新出现.负责阻止的SPID始终具有以下功能:

  • 等待类型= ASYNC_NETWORK_IO
  • 正在运行的SQL是"(@claimid varchar(15))SELECT claimid,enrollid,status,orgclaimid,resubclaimid,primaryclaimid FROM claim WHERE primaryclaimid = @claimid AND primaryclaimid <> claimid)".这是相对无害的SQL,应该只返回一个或两个记录,而不是大数据集.
  • 没有其他SQL语句涉及阻塞,只有这个SQL语句.
  • 这是参数化SQL,其执行计划缓存在sys.dm_exec_cached_plans中.
  • 此SPID在声明表上具有对象级S锁,因此也会阻止声明表的所有UPDATE/INSERT.
  • 主机ID各不相同.不同的Web服务器负责阻塞会话.例如,有时我们追溯到Web服务器1,有时是Web服务器2.

当我们追溯到阻塞中涉及的Web服务器时,我们会看到以下内容:

  • Web服务器上的事件日志中始终存在某种与应用程序相关的错误,该错误链接到SQL会话中的主机ID和主机进程ID.
  • 错误消息各不相同,通常是某种SystemOutofMemory.(这些错误消息似乎与我们过去看到的错误消息类似,没有产生如此严重的后果.我们认为之前发生过,但没有导致阻塞.为什么现在?)
  • Web服务器或SQL Server上的网络适配器没有已知问题.

(无论如何,违规查询返回的记录集很小.)

事情排除在外:

  • 索引经常进行碎片整理.
  • 统计定期更新.
  • 关于claim.primaryclaimid的统计数据的样本量增加.
  • 强制重新编译缓存的执行计划.
  • 使用primaryclaimid,claimid创建复合索引.
  • 没有网络问题.
  • Web服务器上没有已知问题.
  • Web服务器上的应用程序软件没有变化.

我们假设事件链是这样的:

  1. Web服务器进程提交上面的SQL.
  2. SQL Server执行SQL,在此期间它获取声明表上的锁.
  3. Web服务器进程出错并死亡.
  4. SQL服务器会话挂起,等待Web服务器进程读取数据集.
  5. 需要在声明表的某些部分(处理声明的任何人)上获取X锁的SQL Server会话被声明表上的锁阻止,并保持阻塞,直到它们全部达到应用程序超时.

任何在等待供应商帮助时进行故障排除的建议都将受到欢迎.

有没有办法强制SQL Server仅锁定此特定SQL语句的行/页级别?有没有办法在ASYNC_NETWORK_IO等待上设置阈值?

performance sql-server-2005

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

UPDATE语句包含在IF EXISTS块中

我正在尝试编写一个更新列的DML脚本,但我想确保该列首先存在,所以我将它包装在IF EXISTS块中

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN
    UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21
END
Run Code Online (Sandbox Code Playgroud)

所以奇怪的是,即使条件失败,它也会尝试执行更新.所以列不存在,UPDATE语句运行,我得到一个错误.为什么?

更奇怪的是,这确实有效:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN
    EXEC('UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21')
END
Run Code Online (Sandbox Code Playgroud)

UPDATE命令有什么特别之处导致它以这种方式运行吗?

sql t-sql sql-server

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

SqlBulkCopy 无法将“0”、“1”布尔值解析为数据库表上的 BIT

我正在使用我的自定义 CSVDataReader : IDataReader {} 在数据库表中插入批量值。

除了位(来自“1”/“0”)之外的每个数据类型都被完美解析。0 或 1 解析为 bool时,出现以下错误 “无法将数据源中的字符串类型值转换为位类型”

如果我将这些值更改为“true”/“false”。它没有任何问题。

我无法更改 CSV 文件。目前,我在迭代期间将该特定列从“0”/“1”替换为“false”/“True”。但这不是一个优雅的解决方案。

请帮忙 !

谢谢潘克斯

sql-server types casting

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

我们可以更新视图中的数据吗?

  1. 我们可以更新视图中的数据.如果是这样,它是否会反映实际表中的数据.
  2. 如果在该表上创建的视图存在,我们可以删除该表吗?

任何人都可以向我解释上述内容.我对上述概念感到困惑.

sql-server

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

Getdate()函数返回的结果与dotnet中的DateTime.Now不同

如果我运行这两个函数,我会得到不同的结果.将datetime.Now在DOTNET正显示出同样的结果,因为它是在系统时间显示,同时有大约20分钟的区别,如果我使用getdate()...的原因是什么,以及如何克服呢?

.net sql-server

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