在 sql server 2008 中,主键和引用它的外键是否必须具有相同的列大小?有人可以告诉我一个解释这个的文档的链接吗?
谢谢你的帮助。
我试图弄清楚我正在尝试完成的这个删除语句。我了解如何从不在列中的表中删除(到 table2 的子查询)
我有两个多列的表,每个表有两列组成主键。我想你必须加入吗?我想要以下内容:
Delete From tbl1 left join tbl2
on tbl1.PK1 = tbl2.PK1 and tbl1.PK2 = tbl2.PK2
where tbl1_PK1 Not IN(
Select Distinct tbl2.PK1, tbl2.PK2 where DateStr >= GetDate()-365)
Run Code Online (Sandbox Code Playgroud)
我正在尝试从 tbl1 中删除行。这看起来接近正确吗?
编辑添加:
tbl1 PK1, PK2, Col1
tbl2 PK1、PK2、DateStr
Delete From tbl1 left join tbl2
on tbl1.PK1 = tbl2.PK1 and tbl1.PK2 = tbl2.PK2
where tbl1.PK1,tbl1.PK2 Not IN(
Select Distinct tbl2.PK1, tbl2.PK2 where DateStr >= GetDate()-365)
Run Code Online (Sandbox Code Playgroud)
运行 sqlfiddle 后剩下的应该是:
tbl1
('T', '222','asdf')
tbl2
('T', '222','9/26/2014')
Run Code Online (Sandbox Code Playgroud) 我想计算数据库中非空约束的列数。于是想到了查询表sys.all_columns:
select * from sys.all_columns
问题是它为我提供了我不需要的额外信息(系统定义表中的列)。
所以我必须添加一些SQL 代码来确定某些列是否属于用户定义表。最好的方法是什么?
我有一张大表,其结构与此类似:
Id bigint primary key
Sequence int
Parent int foreign key
Data1 varchar(20)
Data2 varchar(20)
Data3 varchar(20)
Data4 varchar(20)
Data5 varchar(20)
Run Code Online (Sandbox Code Playgroud)
数据 1-5 是文本字段(主要是数字和破折号),可用于帮助防止意外记录重复项,但数据实际上偶尔会重复。我们必须让用户确认是的,它是重复的。
对于数百万行,这种重复检查可能非常耗时。我的任务是确保我们可以处理将我们保存在这个数据库中的数据量增加三倍。以前的开发人员告诉我,当前的流程无法处理那么多数据(当然,处理数据的内容比我在这里包括的要多得多,尽管查找重复项的实际查询非常简单系统的这一部分显然对额外的延迟很敏感)。我自己没有做过实验来证明这一点,但我相信他们的判断,无论如何我都想尽可能地减少影响。不幸的是,直到过程的后期,我才可以测试大量的数据。
所有 5 个字段都必须匹配才能算作重复。我怀疑这永远不会改变,但有人告诉我,在可预见的未来,所有 5 个都必须完全匹配。我在想,通过添加一个作为组合值散列的索引列,我将能够更快地找到潜在的重复项。不过,我仍然需要比较各个值以解决哈希冲突。通过结合这些价值本身,我会得到什么吗?那么一个散列列和一个包含所有 5 个值的分隔字符串中的单个列,我用来比较而不是分别比较每个值?
似乎只有当 varchar 不与行的其余部分一起存储时,我才会受益,我一直认为它们是。然而,情况似乎并非如此。我很难找到特定信息,但似乎如果我的行少于 8060 字节,则将在行中分配完整的 20 个字符。只有当行超过 8060 时,才会选择一些 varchar 列移动到单独的页面中。
任何解释如何存储小型 varchars 的文档,以及关于是否将列组合成单个列是否会对性能产生影响的任何建议,都将不胜感激。
编辑:该表将有数百万行(例如估计为 1000 万行)。每行的最大长度肯定会小于 8060 字节,但我现在不能给你一个确切的数字。
我只是想知道,在MERGET-SQL 中,您可以输出OUTPUT $action,Inserted.*和Deleted.*记录。我想问我怎么能得到OUTPUT $action,Inserted.*,Deleted.*在SSIS记录?
我想让用户从 GUI 中查看 SQL Server 日志,而不是通过 xp_readerrorlog。我只是想知道这是否可能?
谢谢你。
sql-server-2008 sql-server ssms sql-server-2008-r2 error-log
我的 SQL Server 数据库中的一个表中有一个列,该列可以超过 8000 个字符。由于 SQL Server 中一列的最大允许字符长度为 8000,如何存储超过 8000 个字符的数据?
环境详细信息:SQL Server 2008 R2。我有在 JBoss 上运行的应用程序,它们使用 JDBC 驱动程序访问数据库。
问题:我的在线数据库服务器 CPU 使用率很高。
使用以下查询,我能够确定有 2 个查询(Select 命令)处于挂起状态(等待类型 - CXPACKET)近 10 分钟并继续进行。我相信这是导致 CPU 使用率高的原因。
USE MASTER GO
SELECT scheduler_id ,
runnable_tasks_count ,
pending_disk_io_count
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255
SELECT qs.percent_complete ,
qs.session_id ,
scheduler_id ,
blocking_session_id ,
qs.status ,
command ,
wait_time ,
wait_type ,
last_wait_type ,
wait_resource ,
ST.text ,
host_name ,
program_name /*
,SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
( (CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE QS.statement_end_offset END - …Run Code Online (Sandbox Code Playgroud) 我们有一个查询会在运行时破坏我们的生产服务器。
它是报告功能的一部分,不好的部分如下所示:
SELECT DISTINCT
mt.ID AS ID
FROM
[dbo].[MyTable] mt
WITH (NOLOCK)
WHERE
(@aVariable IS NULL
OR (CONVERT(VARCHAR(22), mt.Date1, 112) >= CONVERT(VARCHAR(22), @date1, 112))
AND (@status IS NULL
OR @status <> 2
OR ( @status = 2
AND ( SELECT COUNT(*)
FROM
MyTable mt2
WITH (NOLOCK)
WHERE
mt2.CaseID = mt.CaseID
AND mt2.Date1 > mt.Date1
) = 0
)
)
AND (@aSecondVariable IS NULL
OR (CONVERT(VARCHAR(22), mt.Date1, 112) <= CONVERT(VARCHAR(22), @date1, 112)))
AND (@aThirdVariable IS NULL
OR (CONVERT(VARCHAR(22), mt.Date2, 112) >= …Run Code Online (Sandbox Code Playgroud) 这是网址
www.abc.com/a/b/c/d/e/f/g/h/i
Run Code Online (Sandbox Code Playgroud)
我想要这样的结果
www.abc.com/a/b/c/d/e/f/g/h/i
www.abc.com/a/b/c/d/e/f/g/h
www.abc.com/a/b/c/d/e/f/g
www.abc.com/a/b/c/d/e/f
www.abc.com/a/b/c/d/e
www.abc.com/a/b/c/d
www.abc.com/a/b/c
www.abc.com/a/b
www.abc.com/a
www.abc.com/
Run Code Online (Sandbox Code Playgroud)
请看这个代码..
declare @length as int
declare @Totallength as int
declare @min as int
declare @strURL as varchar(max)
set @strURL='www.abc.com/a/b/c/d/e/f/g/h/i'
set @min=1
set @length=(SELECT LEN(@strURL) - LEN(REPLACE(@strURL, '/', '')))
set @Totallength=(select len(@strURL))
if(@length>1)
begin
while(@min<=@length)
begin
--select @strURL=left(@strURL,charindex('/',@strURL)-1)
SELECT @strURL = SUBSTRING( @strURL, CHARINDEX('/', @strURL) + 1, @Totallength)
print @strURL
set @min=@min+1
-- print @min
end
end
Run Code Online (Sandbox Code Playgroud) sql-server-2008 ×10
sql-server ×9
datatypes ×1
error-log ×1
foreign-key ×1
performance ×1
primary-key ×1
ssis ×1
ssms ×1
t-sql ×1
varchar ×1