Sql server 删除以变量作为函数名的Sql函数
我想删除模式中的所有函数,我不想编写需要提前获取所有函数名并将其写入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 =
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语句是分隔的,并且动态查询变量足够大。