【问题标题】:Converting Stored Procedure to Inline Function将存储过程转换为内联函数
【发布时间】:2018-01-18 08:43:10
【问题描述】:

我需要执行更新,但存储过程我不能使用它。所以我别无选择,然后转换为函数。 这是我的存储过程。

alter Proc spIsUnique
@columnname nvarchar(max),
@tablename nvarchar(max)
As
Begin
EXEC ('select IIf (count(*)>1,''False'',''True'') as [IsUnique-check] 
        from '+@tablename+' 
        group by '+@columnname)
End

我尝试将其转换为内联函数

create Function fn_IsUnique(
@columnname nvarchar(max),
@tablename nvarchar(max)
) returns table
As
return
select IIf (count(*)>1,'False','True') as [IsUnique-check] 
        from @tablename
        group by @columnname

它抛出了这个错误

Must declare the table variable "@tablename

帮助我将评分过程转换为内联函数。 编辑:- 如果不能转换成内联函数。 任何替代方式如何将此存储过程的结果用于更新语句。

【问题讨论】:

  • 不幸的是,您将无法在这里做您想做的事情,因为当使用对象名称作为变量(表、视图等)时,您必须使用动态 sql 并使用 exec 或 @ 987654325@,SQL Server 函数有这个限制,你不能从函数内部调用存储过程。
  • 那么任何选择。如何更新
  • 除了您尝试做的事情之外别无选择,它无法完成,但是将表类型参数传递给您的存储过程并从中返回一个表可能会让您接近您想要的位置。
  • 如果您考虑查询的运行方式,您提出的问题并没有多大意义。查询是服务器根据数据的统计信息和索引编译成执行计划的脚本。不同的表导致不同的执行计划。服务器缓存该计划,因此不必每次都重新编译查询。
  • 顺便说一句,如果您想创建表数据的配置文件,包括唯一列、值分布、空频率等,您可以使用 SSIS 中的数据配置文件任务。

标签: sql-server tsql stored-procedures inline-functions


【解决方案1】:

试试这个

CREATE FUNCTION dbo.FnRetCnt
(
    @tablename nvarchar(max)
)
RETURNS BIT
AS
BEGIN

    DECLARE @Ret BIT

    DECLARE @t TABLE
    (
       Cnt INT
    )

    INSERT INTO @t
    SELECT
       SUM(st.row_count)
       FROM
         sys.dm_db_partition_stats st
       WHERE
          object_id = OBJECT_ID(@tablename)

    IF EXISTS(SELECT 1 FROM @t WHERE Cnt>0)
       SET @Ret = 0
    ELSE
       SET @Ret = 1

    RETURN @Ret

END
go

SELECT
    dbo.FnRetCnt('AddressType')

【讨论】:

  • 为什么会回答这个问题? OP 要求具有唯一值的列。
猜你喜欢
  • 2014-08-29
  • 2021-12-12
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2015-08-28
  • 2013-10-10
相关资源
最近更新 更多