解决方案 »
- 两表之间的查询,急! 在线等解决的办法!
- 无法删除发布快照
- 远程调试存过出问题,请问如何解决?
- 在select语句中使用变量
- sql server2005 完整备份问题
- 急,急,急。各位Help me
- 请教下SQL2000 SP4的sp_table_statistics_rowset,貌似它落井下石了个性能问题
- [50分]如何把EXCEL文件导入远程数据库作为一个新表
- 请问我在Query Analyzer 中执行了一句delete from table1, 马上就后悔了但想中断已经来不急了,想问一下该怎样才能恢复?
- 使用sql脚本语言备份数据库
- 表行转换成列求解读!
- 能把SQL SERVER里面表的内容读到Word里面吗?
运行速度在3-4分钟,因为除了cursor其他办法不会用。
IF OBJECT_ID('tempdb..#stats') IS NOT NULL
BEGIN
DROP TABLE #stats
END
SELECT tab_name AS t_name, [col_name] AS c_name, [type] INTO #stats FROM dbo.TableView
ALTER TABLE #stats ADD c_max NVARCHAR(50), c_min NVARCHAR(50), c_countrows INT, c_countvalid INT
GODECLARE
@t_name nvarchar(50),
@c_name nvarchar(50),
@c_type nvarchar(50),
@c_max nvarchar(50),
@c_min nvarchar(50),
@c_countrows int,
@c_countvalid int
DECLARE c_cursor CURSOR FOR
SELECT * FROM #stats
OPEN c_cursor
FETCH NEXT FROM c_cursor INTO
@t_name, @c_name, @c_type, @c_max, @c_min, @c_countrows, @c_countvalid
WHILE @@FETCH_STATUS = 0
BEGIN
IF @c_type='datetime' OR @c_type='int' OR @c_type='decimal' OR @c_type='float' OR @c_type='real'
BEGIN
PRINT ('UPDATE #stats SET c_max=(SELECT MAX(' + @c_name + ') FROM ' + @t_name + '),c_min=(SELECT MIN(' + @c_name + ') FROM ' + @t_name + '),c_countrows=(SELECT COUNT(*) FROM' + @t_name + '),c_countvalid=(SELECT COUNT(' + @c_name + ') FROM ' + @t_name + ') WHERE t_name=''' + @t_name + ''' AND c_name=''' + @c_name + '''')
END
EXEC ('UPDATE #stats SET c_countrows=(SELECT COUNT(*) FROM ' + @t_name + '),c_countvalid=(SELECT COUNT(' + @c_name + ') FROM ' + @t_name + ') WHERE t_name=''' + @t_name + ''' AND c_name=''' + @c_name + '''')
FETCH NEXT FROM c_cursor INTO
@t_name, @c_name, @c_type, @c_max, @c_min, @c_countrows, @c_countvalid
END
CLOSE c_cursor
DEALLOCATE c_cursor
GO
ALTER TABLE #stats ADD c_completeness FLOAT
GO
UPDATE #stats SET c_completeness=CONVERT(FLOAT,ISNULL(c_countvalid,0))/(CASE WHEN CONVERT(FLOAT,ISNULL(c_countrows,0))=0 THEN -1 ELSE CONVERT(FLOAT,ISNULL(c_countrows,0)) END)
GO
SELECT * FROM #stats ORDER BY t_name, c_name
DROP TABLE #stats
GO