使用游标和变量来运行单独的查询

时间:2017-05-03 14:51:26

标签: sql sql-server tsql

我需要一些帮助来使用游标和变量来填充查询。我正在使用SQL Server 2008 R2。

我要做的是填充带有插入的临时表,运行一列数据生成一个变量,然后填充一个查询表中的行数。以下是我到目前为止的情况:

IF OBJECT_ID('tempdb..#part_tables') IS NOT NULL DROP TABLE #part_tables

create table #Part_tables 
(table_Name nvarchar(100))

Insert INTO #Part_Tables (table_name)
SELECT [InstancesTable] FROM [BAMPrimaryImport].[dbo].[bam_Metadata_Partitions]
WHERE [ArchivingInProgress]=0 and ArchivedTime IS NULL
      and creationtime < dateadd(DD,-21,getdate())
  GO

Insert INTO #Part_Tables (table_name)
SELECT [RelationshipsTable]  FROM [BAMPrimaryImport].[dbo].[bam_Metadata_Partitions]
WHERE [ArchivingInProgress]=0 and ArchivedTime IS NULL
      and creationtime < dateadd(DD,-21,getdate())
GO


DECLARE @count_query VARCHAR(MAX)
DECLARE @Value NVARCHAR(100)

SET @Value ='Select Table_Name from #Part_Tables'

SET @count_query ='
    select count (*) from @Value with (NOLOCK)'
WHILE 1 = 1
    BEGIN
        EXEC(@count_query + ' option(maxdop 5) ')
    IF @@rowcount < 1 BREAK;
END

如果这样可行,那太好了!如果你有不同的/更好的方法,我会很感激有人可以提供任何指导。

1 个答案:

答案 0 :(得分:0)

这是从这些表中获取行计数的一种更简单的方法。不需要游标或循环。并且要小心那个NOLOCK提示......它可以做的不仅仅是脏读。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'select count(*) from ' + QUOTENAME(InstancesTable) + ' UNION ALL '
FROM [BAMPrimaryImport].[dbo].[bam_Metadata_Partitions]
WHERE [ArchivingInProgress] = 0 
    and ArchivedTime IS NULL
    and creationtime < dateadd(Day, -21, getdate())

set @SQL = LEFT(@SQL, len(@SQL) - 10)

select @SQL --uncomment exec statement below when satisfied this is correct

--exec sp_executesql @SQL