【问题标题】:Inserting Dynamically from one table into another从一个表动态插入到另一个表
【发布时间】:2015-11-21 19:43:04
【问题描述】:

试图将记录从一张表插入到另一张表中。目标表 (@TableName) 比源表 (@Sourcetable) 多了三个列。这三列是浮点列,并设置为 NULL。

插入零或保留NULL都没有关系,只要插入有效

程序因此失败并给出以下错误

列名或提供的值数与表不匹配 定义。

请参阅下面的程序,任何 cmets 我如何使用下面的程序来做到这一点:

ALTER PROCEDURE [dbo].[usr_INSERTRECORD]
    -- Add the parameters for the stored procedure here
    @SourceTable SYSNAME,
    @TableName SYSNAME,
    @TransDate Date,
    @Symbol nvarchar(50)
    --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    DECLARE @DATEVARCHAR nvarchar(4000);
    SET @DATEVARCHAR = CONVERT(NVARCHAR, @TransDate, 103);

-- Actual Statement that does the insert
-- This is the statement causing the issue; works if schema matches on both tables      
DECLARE @SQLCommand NVARCHAR(MAX) = 
            N'INSERT INTO ' + QUOTENAME(@TableName) + ' SELECT * FROM ' + + QUOTENAME(@SourceTable) 
            + ' WHERE (TRANSDATE = @TransDate AND SYMBOL = @SYMBOL)';

EXECUTE [dbo].[sp_executesql]  @sqlCommand,
                               N'@TransDate date, @Symbol nvarchar(50)',
                               @TransDate = @TransDate, @Symbol = @Symbol;
END

【问题讨论】:

  • 您好 HDB,请注意这样一个事实,即在 SO 上给出答案的专业人士渴望获得声誉积分。为有用的答案投票并检查最佳答案作为接受的答案将是非常好的。这将向其他人表明这个问题已经解决。如果您不能解决您的问题,请发表评论。您可能还想检查您之前的问题...谢谢
  • 建屋局,我刚刚看了你的资料。您提出了 14 个问题,但接受的答案不超过两个。请在这里看一下:stackoverflow.com/help/someone-answers。关键是,未被接受的问题永远保持开放。谢谢

标签: sql sql-server tsql stored-procedures


【解决方案1】:

如果表定义不相同,则不能使用星号来包含所有字段:

你必须使用类似的东西

INSERT INTO table1 (col1, col2, col3, ...) SELECT col1, col2, col3, ... FROM table2

当您尝试一般地填充表格时,您可以尝试像这样创建它们的列列表

SELECT STUFF(
(
SELECT ',' + QUOTENAME(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='YourTableName'
FOR XML PATH('')),1,1,'')

您必须在声明中包含此列列表...

【讨论】:

  • 我看到上面的SELECT STUFF( 查询两次返回相同的列名列表。这给出了一个长度是预期两倍的字符串。
  • @Tor,请详细说明...可能是,您检查了一个对象,该对象以相同的名称存在两次(在不同的模式中)?无论如何,这应该使用QUOTENAME。稍后编辑此内容...
  • 是的,看起来就是这样。一些 goober 试图在目标数据库中创建一个 ODS……只是在不同的模式中。完美地解释了列重复的原因。谢谢!
【解决方案2】:

如果您没有相同的列,则必须明确列出它们。如果目标表有更多,那么你可以在插入端列出它们,如果源表有更多,那么在选择中,但最好是同时列出它们。

您还可以对 select 和 insert 使用视图,以便列数匹配,但无论如何我不建议使用 insert + select * 而不指定列,因为如果有人添加新的,它会中断列到表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 2014-07-29
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多