TABLOCK和TABLOCKX之间有什么区别http://msdn.microsoft.com/en-us/library/ms187373.aspx指出TABLOCK是共享锁,而TABLOCKX是排他锁。 第一个也许只是一个索引锁的种类? 共享锁的概念是什么?
无论如何循环T-SQL中的表variables? DECLARE @table1 TABLE ( col1 int ) INSERT into @table1 SELECT col1 FROM table2 我也使用游标,但是游标似乎不如表variables灵活。 DECLARE cursor1 CURSOR FOR SELECT col1 FROM table2 OPEN cursor1 FETCH NEXT FROM cursor1 我希望能够以与游标相同的方式使用表variables。 这样,我可以在过程的一部分中对表variables执行一些查询,然后稍后为表variables中的每一行执行一些代码。 任何帮助是极大的赞赏。
我find了一个用PATINDEX查找下划线位置的解决scheme: DECLARE @a VARCHAR(10) SET @a = '37_21' PRINT PATINDEX('%_%', @a) — return 1 (false) PRINT PATINDEX('%!%', REPLACE(@a, '_', '!')) — return 3 (correct) 你有其他的想法吗? 像一种逃避下划线字符的方法?
我想写下面的查询: SELECT …, MIN(SomeBitField), … FROM … WHERE … GROUP BY … 问题是, SQL Server不喜欢它,当我想计算一个位字段的最小值时,它返回错误Operand data type bit is invalid for min operator 。 我可以使用以下解决方法: SELECT …, CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), … FROM … WHERE … GROUP BY … 但是,有没有更优雅的东西? (例如,可能有一个我不知道的聚合函数,它计算字段中的逻辑值and位值。)
情况是你在Seconds(XXX.XX)中有一个值,你想用T-SQL转换成HH:MM:SS。 例: 121.25秒变成00:02:01.25
如何排除星期六或星期日的DateTime列中的值? 例如,给出以下数据: date_created '2009-11-26 09:00:00' — Thursday '2009-11-27 09:00:00' — Friday '2009-11-28 09:00:00' — Saturday '2009-11-29 09:00:00' — Sunday '2009-11-30 09:00:00' — Monday 这是我正在寻找的结果: date_created '2009-11-26 09:00:00' — Thursday '2009-11-27 09:00:00' — Friday '2009-11-30 09:00:00' — Monday 谢谢!
我的任务要求我找出“每个date有多less发票?” 我有点卡住了,请求我的教授帮忙。 她给我发了一个问题,回答这个问题:“每种types和版本的炉子有多less?”对于一个挑战,但没有额外的要点,包括炉灶总数。 这是她给我的问题: SELECT STOVE.Type + STOVE.Version AS 'Type+Version' , COUNT(*) AS 'The Count' FROM STOVE GROUP BY STOVE.Type + STOVE.Version WITH ROLLUP; 所以,我调整了查询,直到它满足我的需求。 这就是我想到的: SELECT InvoiceDt , COUNT(InvoiceNbr) AS 'Number of Invoices' FROM INVOICE GROUP BY InvoiceDt WITH ROLLUP ORDER BY InvoiceDt ASC; 它返回了我想要的以下结果。 无论如何,我决定阅读ROLLUP条款,并从微软的文章开始。 它表示ROLLUP子句与CUBE子句类似,但是它以如下方式与CUBE子句区分开来: CUBE生成一个结果集,显示所选列中所有值的组合。 ROLLUP生成一个结果集,显示所选列中值的层次结构的聚合。 所以,我决定用CUBEreplace查询中的ROLLUP,看看会发生什么。 他们产生了相同的结果。 我想这就是我感到困惑的地方。 看来,如果你使用的是我在这里的查询types,这两个子句之间没有任何实际的区别。 是对的吗? […]
在数据库devise方面,我有点老,所以我完全是在列中使用正确的数据大小。 但是,当为一个朋友查看数据库时,我注意到他使用了varchar(max) 。 现在,我的直接想法是把它扔回给他,让他改变它。 但是后来我想了一下,不能拿出一个很好的理由让他不要使用它(如果你想知道的话,他使用了一个casetypes的工具来生成数据库)。 我一直在研究varchar(max)用法的主题,我真的不能想出任何好的理由让他不要使用它。 他不使用索引列,坐在数据库上的应用程序对input有限制,所以不允许在字段中input大量数据。 任何帮助将不胜感激,帮助我让他看到光明:)。
我知道在SQL Server GO 被认为是一个批处理分隔符 。 我的问题是: 有一个批分隔符是什么意思? 它给你什么好处,你为什么要使用它? 例子:我经常看到它在SQL代码中使用如下,我不明白为什么这将被视为最佳做法。 至于我可以告诉代码将没有所有的GO语句相同: USE AdventureWorks2012; GO BEGIN TRANSACTION; GO IF @@TRANCOUNT = 0 BEGIN SELECT FirstName, MiddleName FROM Person.Person WHERE LastName = 'Adams'; ROLLBACK TRANSACTION; PRINT N'Rolling back the transaction two times would cause an error.'; END; ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.'; GO (来源: technet文档 ):
我正在创build将在MS SQL服务器中运行的脚本。 该脚本将运行多个语句,并且需要是事务性的,如果其中一个语句失败,则整体执行被停止并且任何更改被回滚。 在发出ALTER TABLE语句向表中添加列并更新新添加的列时,我无法创build此事务模型。 为了立即访问新添加的列,我使用GO命令来执行ALTER TABLE语句,然后调用我的UPDATE语句。 我面临的问题是我不能在IF语句中发出GO命令。 IF语句在我的事务模型中很重要。 这是我试图运行的脚本的示例代码。 另外请注意,发出一个GO命令,将会放弃@errorCodevariables,并且在使用之前需要在代码中声明这个variables(这不在下面的代码中)。 BEGIN TRANSACTION DECLARE @errorCode INT SET @errorCode = @@ERROR — ********************************** — * Settings — ********************************** IF @errorCode = 0 BEGIN BEGIN TRY ALTER TABLE Color ADD [CodeID] [uniqueidentifier] NOT NULL DEFAULT ('{00000000-0000-0000-0000-000000000000}') GO END TRY BEGIN CATCH SET @errorCode = @@ERROR END CATCH […]