none
TRUNCATE TABLE语句能否内嵌在BEGIN语句中 RRS feed

  • 问题

  • 各位好,

    我的测试环境是SQL Server 2014 SP2,AlwaysOn架构,辅助节点数据库不可读,AG的备份首选项选择的为“主副本”。

    在环境架构及配置不变的前提下,我希望作业或者T-SQL语句脚本能够在辅助节点上(辅助节点为不可读状态)启用并执行,执行的结果是虽然整体上T-SQL语句脚本执行结果显示为成功,但实际上并没有执行BEGIN...END中的脚本内容。

    但是在执行某个T-SQL语句时,作业执行失败,查看报错信息是提示Msg 976,

    我的作业执行的T-SQL语句是一个简单的判断语句,具体如下:

    DECLARE @preferredReplica int

    SET @preferredReplica = (SELECT [master].sys.fn_hadr_backup_is_preferred_replica('TSDB01'))

    IF (@preferredReplica = 1)

    BEGIN

    TRUNCATE TABLE [TSDB01].[dbo].Table01

    END

    我尝试换了一个SELECT语句,执行结果显示的是执行成功,执行时间为00:00:00,也就是T-SQL语句判定了@preferredReplica = 0进而不执行BEGIN...END语句,这个结果是符合我的预期的:

    DECLARE @preferredReplica int

    SET @preferredReplica = (SELECT [master].sys.fn_hadr_backup_is_preferred_replica('TSDB01'))

    IF (@preferredReplica = 1)

    BEGIN

    SELECT * FROM [TSDB01].[dbo].Table01

    END

    那么,TRUNCATE语句是否不能内嵌在上述的判断语句中?能否通过语法逻辑实现上述像SELECT语句那样的执行效果?

    2018年8月24日 8:31

全部回复

  • 建议你先验证一下 SELECT [master].sys.fn_hadr_backup_is_preferred_replica('TSDB01') 的值是否和预期的一致
    2018年8月24日 10:18
  • 辅助节点不可读

    那在辅助节点上还能执行什么?根本都不用判断

    TRUNCATE TABLE在任何地方都可以执行,只要有权限(及数据库、文件组未设为只读)


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    2018年8月25日 9:31
  • 执行的值为0,和预期是一致的。
    2018年8月27日 6:26
  • 你好,

    之所以这么做,背景需求是这样:

    之前我们对于AlwaysOn主辅节点的作业处置是主节点启用,辅节点禁用,后来当我们想实现主辅节点上作业同时启用,这样在主节点和辅节点进行切换后,我们无需再去考虑辅节点的作业是否进行了启用这一操作,因此想通过上述的判断语句进行实现。

    对于上述的判断语句,SQL SERVER在读取并进行判断后,不应该再去执行BEGIN...END之间的语句内容了啊。

    2018年8月27日 6:38
  • 那应该能正常工作,你用 sql server managent studio 执行试试呢
    2018年8月27日 9:55
  • Table01有没有数据关联,导致truncate Table01失败


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2018年8月28日 0:10
  • 这个现象是在生产环境中出现后我用测试环境进行的测试,生产环境中相关的表格是有数据关联的,也就是可以理解为是一个普通的表。
    2018年8月30日 2:31
  • 用的就是sql server managent studio脚本执行的
    2018年8月30日 6:26
  • 是否有触发器之类的,你单独建个测试表测试能正常工作么?

    另外,你可以在 BEGIN 中先加个 PRINT ,看看是否确实在不正确的服务器上执行了 BEGIN 中的语句,或者是这个错误是发生在执行之前

    2018年8月31日 0:50
  • 可以的。另外,sys.fn_hadr_backup_is_preferred_replica,不是判断是不是主副本的。

    你应该用sys.fn_hadr_is_primary_replica


    想不想时已是想,不如不想都不想。

    2018年9月4日 9:15
    版主
  • 用fn_hadr_backup_is_preferred_replica,你要考虑这个实例上根本没这个数据库的情况

    想不想时已是想,不如不想都不想。

    2018年9月4日 9:19
    版主
  • 嗯,因为我们的AG组的备份首选项设置的是主副本,所以我就用fn_hadr_backup_is_preferred_replica这个语句了,数据库是肯定有的。
    2018年9月5日 2:51