【问题标题】:Insert into table from temp table using dynamic SQL; Error: Arithmetic overflow error converting varchar to data type numeric使用动态 SQL 从临时表插入表;错误:将 varchar 转换为数据类型 numeric 的算术溢出错误
【发布时间】:2017-05-18 23:26:49
【问题描述】:

我正在处理 SQL Server 存储过程。

这是有效的代码部分:

INSERT INTO [MYBASE].dbo.[DatabaseName]
    ([Employee No_], [From Date], [To Date], [Description], [Quantity],[First Name], [Last Name])   
    SELECT 
        EmployeeNo, FromDate, ToDate, Description, Quantity, 
        FirstName, LastName 
    FROM 
        #User_Data  

现在,我需要更改这部分:

INSERT INTO [MYBASE].dbo.[DatabaseName]

DatabaseName 将是可变的。

我试过这个:

CREATE TABLE #User_Data 
(
    User_id INTEGER,
    FirstName VARCHAR(30),
    LastName VARCHAR(30),
    EmployeeNo VARCHAR(20),
    Description VARCHAR(50),
    FromDate DATETIME,
    ToDate DATETIME 
)

INSERT INTO #User_Data
    SELECT u.fname, u.lname, u.employee_no,  ... (this works)

DECLARE @InsertStatement VARCHAR(MAX)

SET @InsertStatement =
     'INSERT INTO [MYBASE].dbo.[' + @DatabaseName + ']
               ([Employee No_], [From Date], [To Date], [Description],
                [Quantity], [First Name], [Last Name])   
          SELECT 
              EmployeeNo, FromDate, ToDate, Description,
              Quantity, FirstName, LastName 
          FROM 
              #User_Data'   

    EXEC(@InsertStatement)

但它不起作用。这是我得到的错误:

将 varchar 转换为数字数据类型时出现算术溢出错误。

请帮忙。

【问题讨论】:

  • 为什么要为每个“数据库”创建一个单独的表,而不是一个以“数据库”作为列名的表?
  • 你有一个名为“数据库”的表吗?
  • 不,我没有名为“数据库”的表。我的错,对不起。而不是 'DatabaseName' 是表的真实名称。
  • 正如 Gordon 所指出的,这里最大的问题是您的架构。为什么每个数据库值都需要一个单独的表?它应该是一个表中的一列。那么这整个问题就变得微不足道了。您可以跳过动态 sql,跳过临时表。它就像一个插入语句一样简单。
  • 填充@DatabaseName 的代码部分在哪里?在 EXEC 之前打印您的InsertStatement 会看到什么?

标签: sql sql-server dynamic temp-tables


【解决方案1】:

我一直在使用同义词来避免在引号内写:

Declare @MyDB as nvarchar(100) = 'myDBName'

if exists(select * from sys.synonyms where name = N'TableinMyDB') drop synonym [TableinMyDB];
exec('CREATE SYNONYM [TableinMyDB] FOR [' + @MyDB + '].dbo.[myTableName];');

 INSERT INTO [TableinMyDB]
               (
                [Employee No_]
               ,[From Date]
               ,[To Date]
               ,[Description]
               ,[Quantity]
               ,[First Name]
               ,[Last Name]
               )   

        SELECT 
               EmployeeNo 
               ,FromDate 
               ,ToDate
               ,Description
               ,Quantity
               ,FirstName
               ,LastName 
                FROM #User_Data  

【讨论】:

  • 在我的代码中是这样。我只在删除和重新创建后使用同义词。使用后我也掉了。没有机会假设同义词!
  • 谢谢,我就这样试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多