Pan*_*wal 37 sql-server sql-server-2008 sql-server-2012
我们可以执行Insert/Update/Delete
声明吗SQL Server Functions
?我试过但是发生了SQL Server错误.
错误:
Invalid use of side-effecting or time-dependent operator in 'DELETE' within a function.
Run Code Online (Sandbox Code Playgroud)
AnyBody有任何想法,为什么我们不能使用Insert/Update/Delete
语句SQL Server functions.
等待你的好主意
小智 13
是的你可以!))
我发现了一个方法,使INSERT
,UPDATE
或DELETE
在功能上使用xp_cmdshell
.
所以你只需要替换@sql变量中的代码.
CREATE FUNCTION [dbo].[_tmp_func](@orderID NVARCHAR(50))
RETURNS INT
AS
BEGIN
DECLARE @sql varchar(4000), @cmd varchar(4000)
SELECT @sql = 'INSERT INTO _ord (ord_Code) VALUES (''' + @orderID + ''') '
SELECT @cmd = 'sqlcmd -S ' + @@servername +
' -d ' + db_name() + ' -Q "' + @sql + '"'
EXEC master..xp_cmdshell @cmd, 'no_output'
RETURN 1
END
Run Code Online (Sandbox Code Playgroud)
您不能像使用存储过程那样通过函数更新表,但是可以更新表变量。
因此,例如,您不能在函数中执行此操作:
create table MyTable
(
ID int,
column1 varchar(100)
)
update [MyTable]
set column1='My value'
Run Code Online (Sandbox Code Playgroud)
但您可以执行以下操作:
declare @myTable table
(
ID int,
column1 varchar(100)
)
Update @myTable
set column1='My value'
Run Code Online (Sandbox Code Playgroud)
是的你可以。
但是,它需要具有 EXTERNAL_ACCESS 或 UNSAFE 权限的 SQL CLR 并指定连接字符串。这显然是不推荐的。
例如,使用Eval SQL.NET(一个允许在 SQL 中添加 C# 语法的 SQL CLR)
CREATE FUNCTION [dbo].[fn_modify_table_state]
(
@conn VARCHAR(8000) ,
@sql VARCHAR(8000)
)
RETURNS INT
AS
BEGIN
RETURN SQLNET::New('
using(var connection = new SqlConnection(conn))
{
connection.Open();
using(var command = new SqlCommand(sql, connection))
{
return command.ExecuteNonQuery();
}
}
').ValueString('conn', @conn).ValueString('sql', @sql).EvalReadAccessInt()
END
GO
DECLARE @conn VARCHAR(8000) = 'Data Source=XPS8700;Initial Catalog=SqlServerEval_Debug;Integrated Security=True'
DECLARE @sql VARCHAR(8000) = 'UPDATE [Table_1] SET Value = -1 WHERE Name = ''zzz'''
DECLARE @rowAffecteds INT = dbo.fn_modify_table_state(@conn, @sql)
Run Code Online (Sandbox Code Playgroud)
免责声明:我是Eval SQL.NET项目的所有者
归档时间: |
|
查看次数: |
128045 次 |
最近记录: |