【发布时间】:2020-08-02 01:27:23
【问题描述】:
我是 Oracle 专家,但不是 SQL Server,我尝试翻译我的代码以在 SQL Server 中使用。
我的 Oracle 代码:
create or replace
FUNCTION CheckAndCreateTable
(
TBL_NAME IN VARCHAR2 ,
STMNT in varchar2
) RETURN number AS
Cnt Pls_Integer;
begin
select COUNT (TABLE_NAME) into CNT from USER_TABLES where UPPER(TABLE_NAME)= UPPER(TBL_NAME);
if (CNT = 0 ) then
execute immediate STMNT;
DBMS_OUTPUT.PUT_LINE ('Création de la table ' || TBL_NAME );
return 1;
else
DBMS_OUTPUT.PUT_LINE ('La Table ' || TBL_NAME || ' existe déjà');
return 0;
End If ;
RETURN NULL;
END CheckAndCreateTable;
我已经翻译成:
if object_id('CheckAndCreateTable', 'fn') is not null
drop function CheckAndCreateTable;
go
CREATE FUNCTION CheckAndCreateTable
(@TBL_NAME VARCHAR(4000),
@STMNT varchar(4000))
RETURNS float
AS
BEGIN
DECLARE @Cnt integer;
SELECT @CNT = COUNT(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @TBL_NAME ;
IF (@Cnt = 0)
BEGIN
EXECUTE sp_executesql @STMNT;
RETURN 1;
END
ELSE BEGIN
RETURN 0;
END
RETURN NULL;
END ;
我尝试在 SQL Server 中执行此操作:
SELECT CheckAndCreateTable('MyTable', 'select * from DUAL')
FROM DUAL;
它可以在 SQL Developer for ORACLE 中运行,但不能在 SQL Server 中运行。
只有函数和某些扩展存储过程可以从函数中执行
我也尝试在 ORACLE 中创建程序,正常工作
create or replace
PROCEDURE STAT_CREERTABLESSTRUCT
as
STMNT varchar2(32767 );
RET number;
begin
DBMS_OUTPUT.PUT_LINE('=====================================================');
DBMS_OUTPUT.PUT_LINE(' STAT_CREERTABLESSTRUCT ');
STMNT := 'CREATE TABLE PcaBat
(
CodBat VARCHAR2(12) NOT NULL,
LibBat VARCHAR2(42),
CodEtb VARCHAR2(12),
Dispo CHAR(1)
)';
对于 SQL Server
PROCEDURE STAT_CREERTABLESSTRUCT
AS
BEGIN
DECLARE @STMNT varchar(max);
DECLARE @RET float;
SET NOCOUNT ON;
PRINT '=====================================================';
PRINT ' STAT_CREERTABLESSTRUCT ';
SET @STMNT = 'CREATE TABLE PcaBat
(
CodBat VARCHAR2(12) NOT NULL,
LibBat VARCHAR2(42),
CodEtb VARCHAR2(12),
Dispo CHAR(1)
)';
SET @RET = DBO.CHECKANDCREATETABLE('PcaBat', @STMNT);
END;
但代码在 SQL Server 中不起作用:
exec STAT_CREERTABLESSTRUCT
我总是收到同样的消息错误
只有函数和某些扩展存储过程可以从函数中执行。
在 SQL Server 中,您似乎无法从函数或调用过程执行 SQL 代码...
这是真的吗?你怎么能这样做?
【问题讨论】:
-
错误告诉你真相。您可以在函数内部使用的存储过程很少,
sp_executesql不是其中之一。您想在函数中运行动态语句的事实感觉就像是XY Problem。
标签: sql-server