我正在尝试创建一个简单的存储过程来计算数据库中空记录的数量:
CREATE PROCEDURE dbo.cnt_empty
@col NVARCHAR(10)
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
SELECT COUNT(@col) AS cnt
FROM dbo.mytable
WHERE @col = ''
END
GO
EXECUTE dbo.cnt_empty @col = N'field1' -- nvarchar(10)
我为我测试的所有columsn返回0
。这个程序有什么问题?
答案 0 :(得分:4)
您的字符串未被评估为列名,因此您实际上正在运行“where'field1'=''”
你需要做这样的事情
set @sql = 'select @cnt = COUNT(*) from [' + @tableSchema + '].[' + @tableName +
'] where [' + @columnName + '] is not null';
-- print @sql; --uncomment for debugging
exec sp_executesql @sql, N'@cnt bigint output', @cnt = @cnt output;
查看完整脚本的http://blog.hoegaerden.be/2009/02/15/script-find-all-empty-columns-in-database/。
答案 1 :(得分:2)
通过执行此操作,您的SQL语句将参数视为字符串,而不是列的名称。看看sp_executesql。这将帮助您构建一个SQL字符串并执行它。
答案 2 :(得分:1)
你匹配@col(即'field1')与你的where子句中的空(即'')匹配 - 它永远不会返回一行。
答案 3 :(得分:1)
您要做的是声明一个像@sql VARCHAR(500)
这样的变量然后做
SET @sql ='SELECT COUNT('+ @ col +')AS cnt FROM dbo.mytable'
然后尝试使用名为sp_Executesql的内置sp http://msdn.microsoft.com/en-us/library/ms188001.aspx
这是因为您选择的是变量的计数而不是列的计数。
答案 4 :(得分:1)
看一下这篇文章:http://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/
基本上使用EXEC
语句或sp_executesql
应该是您的选择。