在SQL Server 2005中,是否存在在SQL脚本或存储过程中声明的一次性使用或本地函数的概念?我想在我正在编写的脚本中抽象出一些复杂性,但它需要能够声明一个函数.
只是好奇.
我知道集群索引和非集群索引之间的主要区别,并了解它们的实际工作方式.我理解群集和非群集索引如何提高读取性能.但有一件事我不确定是什么原因让我选择一个而不是另一个.
例如:如果一个表没有聚集索引,那么应该创建一个非聚集索引并且有什么好处呢?
sql-server indexing clustered-index query-tuning non-clustered-index
如何在SQL中为变量分配exec调用的结果?我有一个名为的存储过程up_GetBusinessDay,它返回一个日期.
你能做这样的事吗:
exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1
Run Code Online (Sandbox Code Playgroud) 我有以下两个表:
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
Run Code Online (Sandbox Code Playgroud)
我需要从数据插入Table1到Table2.我可以使用以下语法:
INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1
Run Code Online (Sandbox Code Playgroud)
但是,在我的情况下,重复的ID可能存在Table2(在我的情况下,它只是" 1")并且我不想再次复制,因为这会引发错误.
我可以这样写:
IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
ELSE
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法可以不使用IF - ELSE?我想避免INSERT INTO-SELECT基于某些条件的两个陈述.
我有一个数据表(db是MSSQL):
ID OrderNO PartCode Quantity DateEntered
417 2144 44917 100 18-08-11
418 7235 11762 5 18-08-11
419 9999 60657 100 18-08-11
420 9999 60657 90 19-08-11
Run Code Online (Sandbox Code Playgroud)
我想创建一个返回OrderNO,PartCode和Quantity的查询,但仅用于最后一次注册的订单.
从示例表中我想获得以下信息:
OrderNO PartCode Quantity
2144 44917 100
7235 11762 5
9999 60657 90
Run Code Online (Sandbox Code Playgroud)
请注意,订单9999只返回了一行.
谢谢!
我在SQL Server中有一个表.我想从中删除前1000行.但是,我尝试了这个,但我没有删除前1000行,而是删除了表中的所有行.
这是代码:
delete from [mytab]
select top 1000
a1,a2,a3
from [mytab]
Run Code Online (Sandbox Code Playgroud) 总之,我有一个很大的(不可避免的)动态SQL查询.由于选择标准中的字段数,包含动态SQL的字符串增长超过4000个字符.现在,我知道有一个4000最大值设置NVARCHAR(MAX),但查看Server Profiler中执行的SQL语句
DELARE @SQL NVARCHAR(MAX);
SET @SQL = 'SomeMassiveString > 4000 chars...';
EXEC(@SQL);
GO
Run Code Online (Sandbox Code Playgroud)
似乎工作(!?),对于另一个同样大的查询,它会抛出一个与此4000限制(!?)相关的错误,它基本上修剪了这个4000限制之后的所有SQL,并且给我留下了语法错误.尽管这样的探查,它表示在这个动态的SQL查询全(!?).
究竟发生了什么,我应该将这个@SQL变量转换为VARCHAR并继续使用它吗?
谢谢你的时间.
PS.能够打印超过4000个字符来查看这些大查询也是很好的.以下限制为4000
SELECT CONVERT(XML, @SQL);
PRINT(@SQL);
Run Code Online (Sandbox Code Playgroud)
还有其他很酷的方式吗?
sql sql-server variables string-concatenation sql-server-2008
我是SqlServer的新手,现在我已SqlLocalDb安装在本地工作.很好,但我通常可以看到两个连接字符串,两者都有效:
Data Source=(localdb)\v11.0;Integrated Security=true;
Run Code Online (Sandbox Code Playgroud)
和
Server=(localdb)\v11.0;Integrated Security=true;
Run Code Online (Sandbox Code Playgroud)
这两者之间究竟有什么区别?
我在SQL Server中有大字符串.我想将该字符串截断为10或15个字符
原始字符串
this is test string. this is test string. this is test string. this is test string.
Run Code Online (Sandbox Code Playgroud)
期望的字符串
this is test string. this is ......
Run Code Online (Sandbox Code Playgroud) 我有一个长时间运行的进程,可以在整个持续时间内保持打开一个事务.
我无法控制执行方式.
由于事务在整个持续时间内保持打开状态,因此当事务日志填满时,SQL Server无法增加日志文件的大小.
因此该过程因错误而失败"The transaction log for database 'xxx' is full".
我试图通过增加数据库属性中的事务日志文件的大小来防止这种情况,但我得到了相同的错误.
不确定我接下来应该尝试什么.这个过程持续了几个小时,因此不容易进行反复试验.
有任何想法吗?
如果有人感兴趣,该过程是组织导入 Microsoft Dynamics CRM 4.0.
有足够的磁盘空间,我们有简单的日志记录模式,并在启动进程之前备份了日志.
- = - = - = - = - UPDATE - = - = - = - = -
感谢所有评论到目前为止.以下是让我相信日志因开放交易而不会增长的原因:
我收到以下错误...
Import Organization (Name=xxx, Id=560d04e7-98ed-e211-9759-0050569d6d39) failed with Exception:
System.Data.SqlClient.SqlException: The transaction log for database 'xxx' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases
Run Code Online (Sandbox Code Playgroud)
所以按照这个建议,我去了" log_reuse_wait_desc column …
sql-server ×10
sql ×6
t-sql ×4
dynamics-crm ×1
indexing ×1
localdb ×1
query-tuning ×1
scripting ×1
sql-delete ×1
sql-insert ×1
variables ×1