【发布时间】:2015-07-29 12:44:20
【问题描述】:
BEGIN TRAN
SET XACT_ABORT ON
GO
BEGIN TRY
IF OBJECT_ID('dbo.Offer_GetByStudyId', 'p') IS NULL
EXEC ('CREATE PROCEDURE Offer_GetByStudyId as select 1')
END TRY
BEGIN CATCH
THROW;
END CATCH
GO
IF @@error <> 0 and @@trancount > 0 ROLLBACK
IF @@trancount = 0 BEGIN SET NOCOUNT ON; SET NOEXEC ON; END
GO
BEGIN TRY
ALTER PROCEDURE dbo.Offer_GetByStudyId
@StudyId NVARCHAR(MAX) = NULL
AS
BEGIN
DECLARE @Conditions NVARCHAR(MAX) = '';
IF @StudyId IS NOT NULL
BEGIN
SET @Conditions = @Conditions + ' AND o.StudyId = ' + cast(@StudyId as varchar(10))
END
DECLARE @sql NVARCHAR(MAX) = 'SELECT
o.StudyId as StudyId,
o.SampleId as SampleId,
o.Status as Status,
o.Title as Title,
o.Topic as Topic,
o.Description as Description,
o.TestOffer as TestOffer,
T.CPI as CPI
FROM Offers o
LEFT JOIN [dbo].[Terms] T ON (o.[Id] = T.[OfferId]) AND T.Active = 1
WHERE 1 = 1' + @Conditions
EXEC(@sql)
END
END TRY
BEGIN CATCH
THROW;
END CATCH
这是我的 SQL 脚本,我试图让一个多批处理脚本作为单个事务运行,所以如果一个语句失败,所有语句都将回滚。但是我在这里不断收到此错误:
BEGIN 附近的语法不正确。期待外部
他们所说的开始是后面的:
@StudyId NVARCHAR(MAX) = NULL
【问题讨论】:
-
在另一个过程中改变一个过程有什么意义?
-
您正在尝试在事务中进行程序安装?我不明白这一点,因为 create 只是在执行一个虚拟过程,如果 alter 过程失败,它将把旧版本留在数据库中。
-
另外,您的过程容易受到 SQL 注入的攻击。您应该使用 sp_executesql 和变量,而不是 exec 并将值连接到 sql 中。
标签: sql-server