我试图在使用Microsoft Server 2005的触发器中放置一个try-catch语句.
BEGIN TRANSACTION
BEGIN TRY
--Some More SQL
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF (XACT_STATE()) = -1
BEGIN
ROLLBACK TRANSACTION;
END;
END CATCH
Run Code Online (Sandbox Code Playgroud)
问题是,如果try-catch块捕获了某些内容,我不希望触发器失败.目前,我收到错误"交易在触发器中结束.批次已中止." 如果交易失败.如何让触发器优雅地失败?
另外,如果我删除了该事务,我会收到错误"事务在触发器中注定.批处理已中止.".
BEGIN TRY
--Some More SQL
END TRY
BEGIN CATCH
return
END CATCH
Run Code Online (Sandbox Code Playgroud)
有没有办法解决?
我想为网站seo写一个比较程序(t-sql).
我有一个表'字段'url'(nvarchar()),其中包含网站网址的一部分.例如:' mysyte.com/?id = 2 '.此表的每个网址都包含我需要提取的元数据.
主要问题是网站上的完整网址看起来像' mysyte.com/?id=2®ion=0&page=1 ',我只需要忽略everething,除了表格中的网址:
我的意思是:'mysyte.com/?id=2'=>是'mysyte.com/?id=2®ion=0&page=1'的一部分
我想编写一个存储过程,它将使用一个参数,它将是表名.
例如:
@tablename << Parameter
SELECT * FROM @tablename
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
我写了这个:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetAllInterviewQuestions]
@Alias varchar = null
AS
BEGIN
Exec('Select * FROM Table as ' @Alias)
END
Run Code Online (Sandbox Code Playgroud)
但它说@Alias附近的语法不正确.
我正在寻找在SQL Server中工作的类似于@c#中的符号的东西,这会导致字符串被视为文字.例如:
string text = "abcd\\efg";
Output of text = abcd\efg
string text = @"abcd\\efg";
Output of text = abcd\\efg
Run Code Online (Sandbox Code Playgroud)
注意@如何影响字符串以按字符顺序获取每个字符.
现在我不确定这是可能的,但这是我的问题,也许有更好的方法来解决这个问题.请考虑以下基本查询:
SELECT [Name]
FROM [Test]
WHERE [Name] LIKE (@searchText + '%')
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果他们把一个%,_或任何其他的那些特殊字符,可以影响我喜欢条款.我希望这场比赛就像一个'开始'功能.那么有什么我可以应用于@searchText来说明这一点,或者是否有可能是一个我没想到的更好的解决方案?
编辑:我不希望解决方案是客户端清理.我需要这个存储过程工作,而不依赖于被清理传递的数据.
我需要向数据库中的所有40个用户表添加一个删除标志列.我可以编写一个脚本来循环遍历sys.tables,但我想我会检查一下是否有人有更好的解决方案,或者预先为这个场景创建了sql.
有一个图像字段,并希望从十六进制字符串中插入:
insert into imageTable(imageField)
values(convert(image, 0x3C3F78...))
Run Code Online (Sandbox Code Playgroud)
但是当我运行select时,返回值为0,另外0为0x03C3F78 ...
这个额外的0导致另一个应用程序出现问题,我不想要它.
如何阻止添加额外的0?
架构是:
CREATE TABLE [dbo].[templates](
[templateId] [int] IDENTITY(1,1) NOT NULL,
[templateName] [nvarchar](50) NOT NULL,
[templateBody] [image] NOT NULL,
[templateType] [int] NULL)
Run Code Online (Sandbox Code Playgroud)
并且查询是:
insert into templates(templateName, templateBody, templateType)
values('I love stackoverflow', convert(image, 0x3C3F786D6C2076657273696F6E3D.......), 2)
Run Code Online (Sandbox Code Playgroud)
实际的十六进制字符串非常大,可以在这里发布.
如何将一天[1-31]和一个月[1-12]以及一年(全部为int)转换为串行IN SQL的日期(不转换为varchar)?
什么是一个场景,例证了在SQL Server中对函数名使用前缀(例如fn_GetName)的一个很好的理由?似乎没有必要,因为通常使用它的上下文会清楚它是一个函数.我还没有使用任何其他需要函数前缀的语言,我想不出一个好的场景可以说明为什么SQL有什么不同.
我唯一的想法是,也许在较旧的IDE中,当数据库对象全部列在一起时,将函数分组在一起很有用,但现代IDE已经明确了什么是函数.
这是SS 2005.
为什么我只有4000个字符而不是8000个?
它在4000处截断字符串@ SQL1.
ALTER PROCEDURE sp_AlloctionReport(
@where NVARCHAR(1000),
@alldate NVARCHAR(200),
@alldateprevweek NVARCHAR(200))
AS
DECLARE @SQL1 NVARCHAR(Max)
SET @SQL1 = 'SELECT DISTINCT VenueInfo.VenueID, VenueInfo.VenueName, VenuePanels.PanelID,
VenueInfo.CompanyName, VenuePanels.ProductCode, VenuePanels.MF, VenueInfo.Address1,
VenueInfo.Address2, '' As AllocationDate, '' As AbbreviationCode, VenueInfo.Suburb, VenueInfo.Route, VenueInfo.ContactFirstName,
VenueInfo.ContactLastName, VenueInfo.SuitableTime, VenueInfo.OldVenueName,
VenueCategories.Category, VenueInfo.Phone, VenuePanels.Location, VenuePanels.Comment,
[VenueCategories].[Category] + '' Allocations'' AS ReportHeader,
ljs.AbbreviationCode AS PrevWeekCampaign
FROM (((VenueInfo INNER JOIN VenuePanels ON VenueInfo.VenueID = VenuePanels.VenueID)
INNER JOIN VenueCategories ON VenueInfo.CategoryID = VenueCategories.CategoryID)
LEFT JOIN (SELECT CampaignProductions.AbbreviationCode, VenuePanels.PanelID, CampaignAllocations.AllocationDate
FROM (((VenueInfo …Run Code Online (Sandbox Code Playgroud) 我可以在非空字段中插入空字符串吗?
insert into xyz(A,B) values(1,''); // is this possible if B is NOT NULL?
Run Code Online (Sandbox Code Playgroud)