标签: sql-server-2008

主键和外键的大小

在 sql server 2008 中,主键和引用它的外键是否必须具有相同的列大小?有人可以告诉我一个解释这个的文档的链接吗?

谢谢你的帮助。

sql-server-2008 foreign-key primary-key

2
推荐指数
1
解决办法
3913
查看次数

使用两列从不在另一个表中的表中删除

我试图弄清楚我正在尝试完成的这个删除语句。我了解如何从不在列中的表中删除(到 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)

sql-server-2008 sql-server

2
推荐指数
1
解决办法
5930
查看次数

查找列是否属于用户表

我想计算数据库中非空约束的列数。于是想到了查询表sys.all_columns:
select * from sys.all_columns

问题是它为我提供了我不需要的额外信息(系统定义表中的列)。

所以我必须添加一些SQL 代码来确定某些列是否属于用户定义表。最好的方法是什么?

sql-server-2008 sql-server

2
推荐指数
1
解决办法
1297
查看次数

SQL Server 2008 中的 varchar 存储和比较

我有一张大表,其结构与此类似:

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 字节,但我现在不能给你一个确切的数字。

sql-server-2008 sql-server varchar

2
推荐指数
1
解决办法
396
查看次数

如何在 SSIS 中获取 OUTPUT $action, Inserted.*,Deleted.* 记录

我只是想知道,在MERGET-SQL 中,您可以输出OUTPUT $action,Inserted.*Deleted.*记录。我想问我怎么能得到OUTPUT $actionInserted.*Deleted.*在SSIS记录?

sql-server-2008 sql-server ssis t-sql sql-server-2008-r2

2
推荐指数
1
解决办法
3895
查看次数

在 SSMS GUI 上查看 SQL Server 日志的权限

我想让用户从 GUI 中查看 SQL Server 日志,而不是通过 xp_readerrorlog。我只是想知道这是否可能?

谢谢你。

sql-server-2008 sql-server ssms sql-server-2008-r2 error-log

2
推荐指数
1
解决办法
1万
查看次数

在一列中存储超过 8000 个字节

我的 SQL Server 数据库中的一个表中有一个列,该列可以超过 8000 个字符。由于 SQL Server 中一列的最大允许字符长度为 8000,如何存储超过 8000 个字符的数据?

sql-server-2008 sql-server datatypes

2
推荐指数
1
解决办法
8529
查看次数

SQL 查询处于挂起状态导致 CPU 使用率高

环境详细信息: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)

sql-server-2008 sql-server

2
推荐指数
1
解决办法
2万
查看次数

使用复杂 where 子句对 10M 行进行查询的性能

我们有一个查询会在运行时破坏我们的生产服务器。

它是报告功能的一部分,不好的部分如下所示:

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)

performance sql-server-2008 sql-server query-performance

2
推荐指数
1
解决办法
2993
查看次数

如何像这样在sql server中拆分url

这是网址

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 sql-server

2
推荐指数
1
解决办法
1551
查看次数