仅获取列中的第一个值
仅获取列中的第一个值
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)
FETCH NEXT FROM cursCol1 INTO @tablename
CLOSE cursCol1
DEALLOCATE cursCol1
CLOSE cursCol
DEALLOCATE cursCol
END
END
GO
在执行过程时,我只能从sys.tables
的name列中得到第一个值(行)。
我想要得到sys.tables
中所有行的值。
查询应该逐个获取每个表名,然后为每个表执行查询,以便我可以得到所有表的插入语句。
提前致谢。
在上述代码中,出现了(Only fetching first value in column)的问题。这个问题的原因是在使用游标获取name时,没有使用FETCH NEXT来获取下一个值。解决方法是在FETCH NEXT后添加INTO语句来指定获取的值的存储位置。
修复后的代码如下所示:
CREATE PROC [dbo].[usp_InsertGenerator] AS BEGIN DECLARE @tableName varchar(max) DECLARE @insertTable 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 @columnName nvarchar(3000) DECLARE @dataType nvarchar(3000) DECLARE @insertStatement nvarchar(1000) SET @insertStatement ='INSERT '+ @tableName +'(' SET @columnName ='' DECLARE @value nvarchar(50) FETCH NEXT FROM cursCol INTO @columnName, @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 BEGIN IF @dataType in ('varchar','char','nchar','nvarchar') BEGIN SET @value =+'''''''''+ isnull('+@columnName+','''')+'''''',''+' END ELSE BEGIN SET @value =+'''''''''+ isnull(cast('+@columnName+' as varchar(200)),''0'')+'''''',''+' END SET @insertStatement = @insertStatement + @columnName +',' FETCH NEXT FROM cursCol INTO @columnName, @dataType END BEGIN DECLARE @execStatement nvarchar(4000) SET @execStatement ='SELECT '''+substring(@insertStatement,0,len(@insertStatement)) + ') VALUES(''+ ' + substring(@value,0,len(@value)-2)+'''+'')'' FROM '+ @tableName INSERT INTO @insertTable (insertVal) EXEC (@execStatement) -- PRINT (@execStatement) END CLOSE cursCol DEALLOCATE cursCol FETCH NEXT FROM cursCol1 INTO @tableName END CLOSE cursCol1 DEALLOCATE cursCol1 SELECT * FROM @insertTable END
这样修复后的代码将会正确获取所有表的insert语句,并且将结果存储在一个临时表中。