存储过程:如何使用列作为输入

时间:2011-10-10 12:13:48

标签: sql sql-server tsql sql-server-2008 stored-procedures

我正在尝试创建一个简单的存储过程来计算数据库中空记录的数量:

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。这个程序有什么问题?

5 个答案:

答案 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应该是您的选择。