Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将Oracle存储过程转换为SQL Server过程_Sql Server_Oracle_Stored Procedures - Fatal编程技术网

Sql server 将Oracle存储过程转换为SQL Server过程

Sql server 将Oracle存储过程转换为SQL Server过程,sql-server,oracle,stored-procedures,Sql Server,Oracle,Stored Procedures,我已经在oracle中创建了一个存储过程。现在,我需要将相同的过程转换为SQL Server过程。由于我不擅长SQL程序,请帮助我 以下是Oracle的过程: 此过程将从数据库中获取以“FULLTEXTLOOKTABLE”开头的所有表。该表有4个列(ID(int)、FullTextDetails(nvarchar)、Regex(nvarchar)、MinMatchCount(int))。对于每个表,它将采用“FullTextDetails”列的值,删除所有特殊字符,并采用 "Regex" an

我已经在oracle中创建了一个存储过程。现在,我需要将相同的过程转换为SQL Server过程。由于我不擅长SQL程序,请帮助我

以下是Oracle的过程:
此过程将从数据库中获取以
“FULLTEXTLOOKTABLE”
开头的所有表。该表有4个
列(ID(int)、FullTextDetails(nvarchar)、Regex(nvarchar)、MinMatchCount(int))
。对于每个表,它将采用
“FullTextDetails”
列的值,删除所有特殊字符,并采用

"Regex" and replace
([\~\-]) with ([\~\-])?
(\!) with (\!)?
([\@]) with ([\@])?
(\#) with (\#)?
([\$s\&]) with ([\$s\&])?
(\%) with (\%)?
(\^) with (\^)?

并用新值更新列
“FullTextDetails”和“Regex”
。最后更改被提交。

这里最困难的事情是如何处理regex替换,因为在
T-SQL中没有这样的内置函数。幸运的是,您可以使用SQL CLR集成实现我所展示的功能—基本上,您可以编写
.net
对象,将它们映射到
SQL
对象并使用它们。你需要努力,但那是你唯一的机会

然后,其他事情就很简单了。从该系统对象,您可以获取并循环表名:

SELECT *
FROM [sys].[tables];
您可以使用
游标
,但我更愿意跳过它们。它将是这样的:

DECLARE @Tables TABLE
(
    [name] SYSNAME
);

DECLARE @CurrentTableName SYSNAME;

INSERT INTO @Tables ([name])
SELECT [name]
FROM [sys].[tables]
--WHERE [name] LIKE 'FULLTEXTLOOKTABLE_%';

WHILE EXISTS(SELECT 1 FROM @Tables)
BEGIN;

    SELECT TOP 1 @CurrentTableName = [name]
    FROM @Tables;

    SELECT @CurrentTableName;

    DELETE FROM @Tables
    WHERE [name] = @CurrentTableName;

END;
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);

SET @DynamicTSQLStatement = N'UPDATE [dbo].[table] SET [text] = ''test'' WHERE [ID] = 1';

EXEC sp_executesql @DynamicTSQLStatement; 
对于动态T-SQL语句的构建和执行,您有两个选项。您可以构建整个语句并对每个循环执行它,如下所示:

DECLARE @Tables TABLE
(
    [name] SYSNAME
);

DECLARE @CurrentTableName SYSNAME;

INSERT INTO @Tables ([name])
SELECT [name]
FROM [sys].[tables]
--WHERE [name] LIKE 'FULLTEXTLOOKTABLE_%';

WHILE EXISTS(SELECT 1 FROM @Tables)
BEGIN;

    SELECT TOP 1 @CurrentTableName = [name]
    FROM @Tables;

    SELECT @CurrentTableName;

    DELETE FROM @Tables
    WHERE [name] = @CurrentTableName;

END;
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);

SET @DynamicTSQLStatement = N'UPDATE [dbo].[table] SET [text] = ''test'' WHERE [ID] = 1';

EXEC sp_executesql @DynamicTSQLStatement; 
或者,您可以将sp_executesql
与一起使用,并创建一个用当前值填充的模板

我希望这几点足以完成这项任务