【问题标题】:Exception Handling in Dynamic SQL in SQL ServerSQL Server 中动态 SQL 中的异常处理
【发布时间】:2013-04-09 06:30:51
【问题描述】:

在动态 SQL 语句中,一个 @STU_ID 值未能将数据插入到另一个表中。在这里,如果执行失败,我需要知道哪个@STU_ID。

CREATE PROC DATA_COPY
 (
 @SRC_TABLE VARCHAR(30),
 @DEST_TABLE VARCHAR(30)
 )
 AS
 DECLARE @STU_ID INT
 BEGIN
  DECLARE STUDENT_CURSOR CURSOR FOR
  SELECT DISTINCT STU_ID FROM STUDENT

  OPEN STUDENT_CURSOR
        FETCH NEXT FROM STUDENT_CURSOR INTO @STU_ID
    WHILE @@FETCH_STATUS = 0
        BEGIN

EXEC ('INSERT INTO '+@DEST_TABLE+'
    SELECT *
    FROM '+@SRC_TABLE+' 
    WHERE STU_ID='+@STU_ID)

        FETCH NEXT FROM STUDENT_CURSOR INTO @STU_ID
    END
    CLOSE STUDENT_CURSOR
    DEALLOCATE STUDENT_CURSOR
 END

你能帮我怎么做吗?

谢谢

【问题讨论】:

  • 您遇到错误了吗?如果是这样,你可以包括它吗?很可能存在SELECT * FROM '+@SRC_TABLE+' WHERE STU_ID='+@STU_ID 不返回任何结果的情况。在执行插入之前,您应该检查以确保有数据。此外,您正在插入基于 SELECT * 的表。当架构发生变化时,这会让你陷入困境。
  • 错误是:Msg 8152, Level 16, State 14, Line 1 字符串或二进制数据将被截断。
  • 我将目标表中一列的大小显式更改为低于源表,我的要求是在执行存储过程时收到一条消息“@STU_ID 无法插入数据进入目标表”
  • 您的错误似乎与ID无关。您正在尝试将数据插入到不足以存储变量中的数据的列中。例如。您的 @SRC_TABLE 列长度与 @DEST_TABLE 不匹配。见stackoverflow.com/questions/779082/…
  • 好的,谢谢,我会检查你分享的链接

标签: sql-server


【解决方案1】:

您可以使用TRY CATCH 捕获错误上下文期间的数据

BEGIN TRY
    EXEC ('INSERT INTO '+@DEST_TABLE+'
    SELECT *
    FROM '+@SRC_TABLE+' 
    WHERE STU_ID='+@STU_ID)
END TRY
BEGIN CATCH
    PRINT 'ERROR WITH VALUE @STU_ID = ' + CONVERT(VARCHAR,@STU_ID)
END CATCH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多