【问题标题】:Function variable is not recognize in subquery子查询中无法识别函数变量
【发布时间】:2019-12-03 19:31:41
【问题描述】:

我想编写一个计算字段的非空和非空条目的函数。我的问题是查询没有运行,因为 @tableName 变量在 select 语句中无法识别,我不知道为什么

create function dbo.getCount(@cod int, @columnName as varchar(20), @tableName as varchar(20))
Returns int as 
Begin

--Count all filled entries
Return (select COUNT(*) from @tableName
where @columnName <> '' and @columnName is not null)

End;
go 

【问题讨论】:

  • 如果我无法使用某个函数来完成我尝试完成的任务,您有什么建议?存储过程?
  • “存储过程?” 是的,我现在正在写答案。
  • 旁白:如果计算机可以随心所欲地决定一个变量是否包含一个值或看起来像有点的东西可能值得的代码,你将如何编写工作代码执行? declare @Value as VarChar(10) = '2 x pi'; if ( 6.28 = @Value ) ...? select * from @Name where @Name not like 'sys.%' and @ColumnName &gt; @ColumnValue order by @StuffThatMightHaveColumnNamesOrNumbersWithDirections;?

标签: sql-server function tsql


【解决方案1】:

如 cmets 中所述,但重申一下,因为我将在回答后删除它们:

由于多种原因,您不能使用函数执行此操作。 SELECT COUNT(*) FROM @TableName 表示计算行数 表变量 @TableName 不是 名称是@TableName 的表。 WHERE @ColumnName &lt;&gt; '' 表示 标量变量 的值没有 '' 的值, 其中列(在上述表格中)的值名称为@ColumnName 不具有值''

而且你不能在函数中做这种事情,你 需要动态SQL;并且您不能在函数中使用动态 SQL(因为您 不能使用EXEC 命令)。

但是,您可以使用存储过程来做到这一点:

CREATE PROC dbo.GetCount @SchemaName sysname = N'dbo', @TableName sysname, @ColumnName sysname, @Count int OUTPUT AS
BEGIN

    DECLARE @SQL nvarchar(MAX),
            @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

    SELECT @SQL = N'SELECT @Count = COUNT(NULLIF(' + QUOTENAME(c.[name]) + N',''''))' + @CRLF +
                  N'FROM ' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.[name]) + N';'
    FROM sys.schemas s
         JOIN sys.tables t ON s.schema_id = t.schema_id
         JOIN sys.columns c ON t.object_id = c.object_id
    WHERE s.[name] = @SchemaName
      AND t.[name] = @TableName
      AND c.[name] = @ColumnName;
    --PRINT @SQL; --Your debugging friend

    EXEC sp_executesql @SQL, N'@Count int OUTPUT', @Count OUTPUT;

END
GO

然后您像下面这样运行 SP(带有示例表):

CREATE TABLE dbo.TestTable (SomeColumn varchar(10));
INSERT INTO dbo.TestTable (SomeColumn)
VALUES(''),('abc'),(NULL);
GO


DECLARE @Count int;
EXEC dbo.GetCount @TableName = N'TestTable', @ColumnName = N'SomeColumn', @Count = @Count OUTPUT;

SELECT @Count; --Returns 1
GO

DB<>Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2020-07-25
    相关资源
    最近更新 更多