Sql server 删除以变量作为函数名的Sql函数

Sql server 删除以变量作为函数名的Sql函数,sql-server,function,Sql Server,Function,我想删除模式中的所有函数,我不想编写需要提前获取所有函数名并将其写入SQL的内容 DROP FUNCTION MySchema.FunctionName1 DROP FUNCTION MySchema.FunctionName2 ... etc 我试过: DECLARE @FuncName varchar(100) WHILE (SELECT Count(*) From information_schema.routines WHERE SPECIFIC_SCHEMA =

我想删除模式中的所有函数,我不想编写需要提前获取所有函数名并将其写入SQL的内容

DROP FUNCTION MySchema.FunctionName1
DROP FUNCTION MySchema.FunctionName2
... etc
我试过:

DECLARE @FuncName varchar(100)

WHILE (SELECT Count(*) From information_schema.routines 
         WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function') > 0
BEGIN
    SELECT top(1) @FuncName = ROUTINE_NAME FROM information_schema.routines
       WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function'

    BEGIN
        DROP FUNCTION @FuncName  -- it doesn't like it because it is a string variable
    END     

END
有点类似,但只是像第一个示例那样生成SQL,实际上并不运行它

DECLARE @FuncName nvarchar(500)

WHILE (SELECT Count(*) From information_schema.routines 
         WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function') > 0
BEGIN
    SELECT top(1) @FuncName = 'DROP FUNCTION ' + SPECIFIC_SCHEMA + '.' + ROUTINE_NAME FROM information_schema.routines
       WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function'

    BEGIN
        EXEC (@FuncName)  -- it doesn't like it because it is a string variable
    END     

END
您还可以使用下面的命令一次性删除所有函数

DECLARE @FuncName nvarchar(MAX) = ''

SELECT @FuncName = @FuncName + 'DROP FUNCTION ' + SPECIFIC_SCHEMA + '.' + ROUTINE_NAME + CHAR(10) 
FROM information_schema.routines
WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function'

EXEC sp_executesql @FuncName
试试这个动态sql

DECLARE @FuncName nvarchar(500)

WHILE (SELECT Count(*) From information_schema.routines 
         WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function') > 0
BEGIN
    SELECT top(1) @FuncName = 'DROP FUNCTION ' + SPECIFIC_SCHEMA + '.' + ROUTINE_NAME FROM information_schema.routines
       WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function'

    BEGIN
        EXEC (@FuncName)  -- it doesn't like it because it is a string variable
    END     

END
您还可以使用下面的命令一次性删除所有函数

DECLARE @FuncName nvarchar(MAX) = ''

SELECT @FuncName = @FuncName + 'DROP FUNCTION ' + SPECIFIC_SCHEMA + '.' + ROUTINE_NAME + CHAR(10) 
FROM information_schema.routines
WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function'

EXEC sp_executesql @FuncName

根据Jatin Patel的回答,我需要知道动态sql位! (这可能是一条评论,但stackoverflow无法处理@符号) 为了可读性,我使用了以下版本,@FuncName保留了它的原始含义

DECLARE @FuncName varchar(100)

WHILE (SELECT COUNT(*) 
       FROM information_schema.routines 
       WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function' ) > 0
BEGIN
    SELECT TOP(1) @FuncName = ROUTINE_NAME
    FROM information_schema.routines
    WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function'

    BEGIN
        EXEC ('DROP FUNCTION MySchema.' + @FuncName)
    END     

END

根据Jatin Patel的回答,我需要知道动态sql位! (这可能是一条评论,但stackoverflow无法处理@符号) 为了可读性,我使用了以下版本,@FuncName保留了它的原始含义

DECLARE @FuncName varchar(100)

WHILE (SELECT COUNT(*) 
       FROM information_schema.routines 
       WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function' ) > 0
BEGIN
    SELECT TOP(1) @FuncName = ROUTINE_NAME
    FROM information_schema.routines
    WHERE SPECIFIC_SCHEMA = 'MySchema' AND ROUTINE_TYPE = 'function'

    BEGIN
        EXEC ('DROP FUNCTION MySchema.' + @FuncName)
    END     

END

您正在寻找的技术称为。要格外小心,以确保您的安全。这项技术可以打开。除非某个函数(由授权或未授权的人)被放到数据库中,并且它被称为“MySchema.FunctionName GO DROP TABLE users”或其他同样荒谬的东西,否则我看不出该评论试图告诉我什么您正在寻找的技术被调用了。要格外小心,以确保您的安全。这项技术是可以打开的。除非一个函数被放到数据库中(无论是由授权人还是未授权人),它被称为“MySchema.FunctionName GO DROP TABLE users”或其他同样荒谬的东西,否则我看不出该评论试图告诉我什么,你也可以不使用循环编写它。只需确保drop语句有
GO
分隔符,并且动态查询变量足够大。您也可以在不使用循环的情况下编写此语句。只需确保drop语句是分隔的,并且动态查询变量足够大。