【问题标题】:Only fetching first value in column仅获取列中的第一个值
【发布时间】:2021-05-25 10:12:58
【问题描述】:
  CREATE PROC [dbo].[usp_InsertGenerator]
  AS
  BEGIN
      DECLARE @tablename varchar(max)

      DECLARE cursCol1 CURSOR FOR
      SELECT name FROM sys.tables 

      OPEN cursCol1
      FETCH NEXT FROM cursCol1 INTO @tablename

      DECLARE cursCol CURSOR FOR
      SELECT column_name, data_type
      FROM information_schema.columns 
      WHERE table_name = @tableName

      OPEN cursCol

      DECLARE @string nvarchar(3000) 
      DECLARE @stringData nvarchar(3000)
      DECLARE @dataType nvarchar(1000)
      SET @string='INSERT '+@tableName+'('
      SET @stringData=''
      DECLARE @colName nvarchar(50)

      FETCH NEXT FROM cursCol INTO @colName,@dataType
      IF @@fetch_status<>0
      BEGIN
          PRINT 'Table '+@tableName+' not found, processing skipped.'
           --FETCH NEXT FROM cursCol1 INTO @tablename
          CLOSE curscol
          DEALLOCATE curscol
          RETURN
      END
      WHILE @@FETCH_STATUS=0
      --FETCH NEXT FROM cursCol1 INTO @tablename
      BEGIN
          IF @dataType in ('varchar','char','nchar','nvarchar')
          BEGIN
              SET @stringData=@stringData+'''''''''+
                      isnull('+@colName+','''')+'''''',''+'
          END
          ELSE
          BEGIN
            SET @stringData=@stringData+'''''''''+
          isnull(cast('+@colName+' as varchar(200)),''0'')+'''''',''+'
          END

          SET @string=@string+@colName+','
          FETCH NEXT FROM cursCol INTO @colName ,@dataType
      END

      BEGIN
          DECLARE @Query nvarchar(4000)
          SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') 
              VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+'''+'')'' 
              FROM '+@tableName
        
          PRINT (@query)
          CLOSE cursCol1
          DEALLOCATE cursCol1
          CLOSE cursCol
          DEALLOCATE cursCol
      END
  END
  GO 

执行过程时,我只从sys.tables 的名称列中获取第一个值(行)。 我希望它用于sys.tables 中的所有行。 查询应该一个一个地获取每个表名,然后对每个表执行查询,以便我可以获得所有表的插入语句。 提前致谢。

【问题讨论】:

  • 如果您想要第一行,则使用TOP 1 并添加ORDER BY 以保证结果一致。但你是already told this
  • @Larnu 我不想要第一行。我希望对每一行一个一个地执行这个查询。
  • 但是,你又想在这里重新发明轮子。您显然不熟悉 T-SQL,因此您不应该尝试这项任务。如果您正在寻找它们,那么已经有解决方案了。
  • 你从来没有回答过why 你想这样做... SQL Server 中已经存在的备份解决方案有什么问题?我不怀疑我们这里有一个XY Problem

标签: sql sql-server tsql


【解决方案1】:

请尝试使用游标获取名称,cursCol1 应该在 cursCol 之后最后关闭。 cursCol1 也缺少 FETCH NEXT

CREATE PROC [dbo].[usp_InsertGenerator]
AS
BEGIN
  DECLARE @tablename varchar(max)
  DECLARE @tbl table (insertVal varchar(max))
  DECLARE cursCol1 CURSOR FOR
  SELECT name FROM sys.tables 

  OPEN cursCol1
  FETCH NEXT FROM cursCol1 INTO @tablename
  WHILE @@FETCH_STATUS=0
  begin
      DECLARE cursCol CURSOR FOR
      SELECT column_name, data_type
      FROM information_schema.columns 
      WHERE table_name = @tableName

      OPEN cursCol
      DECLARE @string nvarchar(3000) 
      DECLARE @stringData nvarchar(3000)
      DECLARE @dataType nvarchar(1000)
      SET @string='INSERT '+@tableName+'('
      SET @stringData=''
      DECLARE @colName nvarchar(50)

      FETCH NEXT FROM cursCol INTO @colName,@dataType
      IF @@fetch_status<>0
      BEGIN
          PRINT 'Table '+@tableName+' not found, processing skipped.'
           FETCH NEXT FROM cursCol1 INTO @tablename
           CLOSE curscol
           DEALLOCATE curscol
           RETURN
      END
      WHILE @@FETCH_STATUS=0
      --FETCH NEXT FROM cursCol1 INTO @tablename
      BEGIN
          IF @dataType in ('varchar','char','nchar','nvarchar')
          BEGIN
              SET @stringData=@stringData+'''''''''+
                      isnull('+@colName+','''')+'''''',''+'
          END
          ELSE
          BEGIN
            SET @stringData=@stringData+'''''''''+
          isnull(cast('+@colName+' as varchar(200)),''0'')+'''''',''+'
          END

          SET @string=@string+@colName+','
          FETCH NEXT FROM cursCol INTO @colName ,@dataType
      END
        BEGIN
              DECLARE @Query nvarchar(4000)
              SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') 
                  VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+'''+'')'' 
                  FROM '+@tableName
              
              INSERT INTO @tbl (insertVal) EXEC (@query)
              -- PRINT (@query)
          END
      CLOSE cursCol
      DEALLOCATE cursCol
    FETCH NEXT FROM cursCol1 INTO @tablename
    END
    CLOSE cursCol1
    DEALLOCATE cursCol1  
    SELECT * FROM @tbl
END

【讨论】:

  • 请不要对自己的文本使用引号格式,它只能用于“引用”其他地方的内容。此外,您在第一次被问到时已经回答了这个问题。请不要鼓励提出不好的问题......而是让 OP 回到原来的问题。
  • 谢谢。但我现在得到的是多个表。每张桌子都有一个单独的结果。如何在一个临时表中插入插入语句或将所有结果放在一起
  • 我已经编辑了上述程序。我添加了临时表'@tbl'并插入了结果的所有插入。请试试这个。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 2019-08-14
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多