标签: t-sql

已用空间和已分配空间有什么区别?

我正在学习数据库操作,我在网上找到了一些资源,这些资源让我有了一个松散的理解,但我自己仍然无法解释其中的区别。请像我五岁那样解释。我想确保我有一个坚实的基础来扩展我的知识。

t-sql disk-space

3
推荐指数
1
解决办法
5228
查看次数

如何从游标中获取到表变量?

我有一个游标定义为:

DECLARE idCursor CURSOR         
    FOR SELECT DISTINCT [id], [data]
        FROM #tempTable  
Run Code Online (Sandbox Code Playgroud)

我有一个变量定义为:

DECLARE @currentId TABLE (
                            [id] int,
                            [data] char(1)
                         );  
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将下一个结果提取到 @currentId

FETCH NEXT FROM idCursor INTO @currentId  
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Must declare the scalar variable "@currentId".  
Run Code Online (Sandbox Code Playgroud)

如何在表中获取游标获取的结果?我知道我可以声明两个变量并单独存储结果。但是对于包含许多列的表来说,这将是耗时的。

t-sql sql-server-2008-r2 cursors

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

使用 SQLOLEDB 或 MSDASQL 的一条 SQL 语句产生不同的结果

我将 VB6 与 SQLOLEDB 和 MSDASQL 一起使用。通过切换提供程序,我注意到一次查询得到了不同的结果。

我的查询检查一些服务器设置并执行两个 BACKUP 语句之一。

当我使用 SQLOLEDB 时,一切正常并且备份被创建。如果我使用的是 MSDASQL,则不会发生错误,但不会创建备份。

这是同一个服务器、同一个用户和同一个语句。

我使用过 SQL Profiler,它显示 100% 执行了相同的命令。即使我复制 MSDASQL 命令并在 SSMS 中执行它,也会创建备份,但不会使用 VB6。

我的声明:

DECLARE @s varchar(1000), @ver int
SET @ver = 10
SELECT @s = case
WHEN
@ver > 9
THEN
'BACKUP DATABASE [DB] TO DISK = ''C:\SQL Backup\Backup.dat'' WITH  COMPRESSION, NOFORMAT, NOINIT, SKIP, REWIND, NOUNLOAD, STATS = 10'
ELSE
'BACKUP DATABASE [DB] TO DISK = ''C:\SQL Backup\Backup.dat'' WITH  NOFORMAT, NOINIT, SKIP, REWIND, NOUNLOAD, STATS = 10;' …
Run Code Online (Sandbox Code Playgroud)

sql-server backup profiler t-sql

3
推荐指数
1
解决办法
349
查看次数

检查多个表的所有列中的空值的最有效方法是什么?

假设我有三个表或四个表,我想检查存在的值,但我不希望它们中的任何一个为空。如果它们为空,我将每行发送一封电子邮件通知。解决这个问题的最佳方法是什么?我应该单独使用 IF 语句创建存储过程吗?

我这样说是因为所有这些表都没有任何限制,它们只是从 Excel 表中提取数据。因此,即使列名不同,使表类型变量和联合或内部连接也不会返回任何内容,但它们存储的信息是相同类型的信息。因此,例如,如果在一个表中存在一个名为“DueDate”的列,在另一个表中,这种相同类型的信息称为“PaymentDate”。我将如何对所有这些表执行这样的检查?

更新:这是我现在想到的:假设两个表是 A 和 B,然后

DECLARE @messageBody NVARCHAR(MAX)
DECLARE @iterator int
DECLARE @Rowcount int
DECLARE @varTableA TABLE(tablecounter int IDENTITY(1,1), DueDate date, Account NVARCHAR(20), Retailer NVARCHAR(20), Interest float)


INSERT INTO @varTableA (DueDate, Account, Retailer, Interest)
SELECT DueDate, Account, Retailer, Interest
FROM TableA 
WHERE DueDate IS NULL OR Account IS NULL OR Retailer IS NULL OR Interest IS NULL

SET @Rowcount = @@ROWCOUNT
SET @iterator = 1


WHILE(@iterator <= @Rowcount)
BEGIN 

SET @messageBody = (SELECT 'No …
Run Code Online (Sandbox Code Playgroud)

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

3
推荐指数
1
解决办法
1469
查看次数

按日期时间排序,最后 00:00:00

order by datetimecolumn订购这样的datetime列:

datetimecolumn   
2014-09-04 00:00:00
2014-09-04 00:00:00
2014-09-04 01:00:00
2014-09-05 00:00:00
2014-09-05 01:00:00
2014-09-05 02:00:00
Run Code Online (Sandbox Code Playgroud)

如何对数据进行排序,以便 00:00:00 的值是最后一个,但仍然按时间升序排列值,如下所示:

datetimecolumn    
2014-09-04 01:00:00
2014-09-04 00:00:00
2014-09-04 00:00:00
2014-09-05 01:00:00
2014-09-05 02:00:00
2014-09-05 00:00:00
Run Code Online (Sandbox Code Playgroud)

愚蠢的业务规则,我知道我知道......基本上如果“用户”没有指定时间,时间无关紧要(所以它排在列表的底部)。

sql-server order-by t-sql

3
推荐指数
2
解决办法
7981
查看次数

是否可以在 case 语句中组合局部变量?

DECLARE @CalcQuery varchar(340)
SET @CalcQuery = (SELECT
    sum(T0.[LineTotal])
FROM 
    RDR1 T0  
        INNER JOIN ORDR T1 ON T0.[DocEntry] = T1.[DocEntry]
        INNER JOIN [@SES_SSNSBRG] T2 ON T0.[ItemCode] = T2.[U_SES_ItemCode]
        INNER JOIN [@SES_SEASONS] T3 ON T2.[U_SES_SEASON] = T3.[Code]
WHERE
    T3.[Name] = 'Wild Heart SP-1' 
    AND 
    T0.[Project] = 'ATL Market Molina')

SELECT DISTINCT
T0.[Project],
CASE 
   WHEN T0.[Project] = 'ATL Market Molina' 
   THEN @CalcQuery 
   END [Season Total]
FROM
RDR1 T0  
INNER JOIN ORDR T1 ON T0.[DocEntry] = T1.[DocEntry]
INNER JOIN [@SES_SSNSBRG] T2 ON T0.[ItemCode] = …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

3
推荐指数
1
解决办法
59
查看次数

通过查找表更新包含特定前缀的字段

我有一个临时表#NAMEOLD_NAMENEW,其中包含一列NAMEOLD和一列NAMENEW,其中每一行都包含要更新的值的旧值和新值。该表由大约 2.000 行组成。我在 上创建了一个聚集索引NAMEOLD

临时表将用于更新数据库中的某些字段。我知道哪些表中的哪些列需要更新(大约 25 列超过 20 个表)。

现在,需要更新的字段包含字符串DOMAIN\作为前缀,然后是NAMEOLD临时表的值。

我想要做的是:使用临时表将字符串的完整值DOMAIN\加上之后的字符串替换为表中的适当值#NAMEOLD_NAMENEW

例子:

示例数据#NAMEOLD_NAMENEW

NAME_OLD NAMENEW
user1 user5
user2 user6

示例数据TABLE1

ColumnWithName1
域\用户 1
域\用户 2

现在运行查询应该更新TABLE1为:

ColumnWithName1
USER5
user6

我认为多次扫描整个表不会表现得足够好(SELECT在某些表上已经需要几分钟)。

我想到的是输入所有需要更新的列,然后使用带有捕获组的正则表达式更新它们。像这样(非工作代码):

UPDATE [dbo].[Table1]
SET [ColumnWithName1] = (SELECT [NAMENEW] from new_old WHERE [NAMEOLD] = [/1]) -- first CAPTUREGROUP??
FROM #NAMEOLD_NAMENEW new_old
WHERE [ColumnWithName1] like '%DOMAIN\(.*)'
Run Code Online (Sandbox Code Playgroud)

此处捕获组不起作用,因为它似乎不存在于 T-SQL …

performance sql-server t-sql regex query-performance

3
推荐指数
1
解决办法
2605
查看次数

验证小数点前三位和小数点后六位

我有nvarchar 数据类型的经度纬度列。用户可以输入类似 (23.23424432),(432423.343) 的内容,这是不允许的。

谁能帮我在 SQL Server 中验证这一点?

  • 用户可以输入的数据:例如:0, 12, 101.0, 111.022222
  • 用户无法输入的数据:例如:1111、111.2222222、1234.1111

它应该只接受这种格式:(232.343244)

下面的代码接受任何数字:

 + CASE WHEN (CAST(A.GPS_LATITUDE AS NVARCHAR) IS NOT NULL AND CAST(A.GPS_LATITUDE AS NVARCHAR) <>'' AND CAST(A.GPS_LATITUDE AS NVARCHAR) NOT LIKE'%*%') 
AND ISNUMERIC(CAST(A.GPS_LATITUDE AS NVARCHAR)+'e0') = 0 OR (LEN(A.GPS_LATITUDE)>20)
 THEN 'Invalid Latitude. ' ELSE '' END
+ CASE WHEN (CAST(A.GPS_LONGITUDE AS NVARCHAR) IS NOT NULL AND CAST(A.GPS_LONGITUDE AS NVARCHAR) <>'' AND CAST(A.GPS_LONGITUDE AS NVARCHAR) NOT LIKE'%*%')
AND ISNUMERIC(CAST(A.GPS_LONGITUDE AS NVARCHAR)+'e0') = …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2 data-validation

3
推荐指数
1
解决办法
2836
查看次数

添加 Where 子句使数据倾斜

这是我使用查询返回的结果集:

empname itemssold
JJ      14
Run Code Online (Sandbox Code Playgroud)

但这是我想要的结果集:

empname itemssold
AA      0
BB      0
CC      0
DD      0
JJ      14
RR      0
Run Code Online (Sandbox Code Playgroud)

它似乎会拉动所有员工,直到我将where子句添加到我的查询中,这让我想知道我是否在错误的位置添加了它,或者我是否错误地设置了我的查询?

以下是我使用的 DDL 和我的查询:

Create Table #ShowAll
(
  empname varchar(1000)
  ,empid varchar(100)
)

Create Table #Data
(
  empid varchar(100)
  ,itemssold int
  ,beenverified varchar(100)
)

Insert Into #ShowAll Values
('JJ', 'J1'), 
('AA', 'A1'), 
('BB', 'B1'), 
('CC', 'C1'),
('DD', 'D1'), 
('RR', 'R1')

Insert Into #Data Values
('J1','14', 'Yes'), 
('A1', '12','No'), 
('B1', '13', 'No')

Select sa.empname
    , Da.itemssold
FROM #ShowAll sa …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2000 t-sql

3
推荐指数
1
解决办法
292
查看次数

生成 XML 的语法不正确

我试图在 SQL Server 2000 SP4 中运行以下代码,但出现错误。

Declare @Body varchar(8000);
Declare @TableHead varchar(8000);
Declare @TableTail varchar(8000);

Set NoCount On;
Set @TableTail = '</table></body></html>';
Set @TableHead = '<html><head>' + 
            '<style>
    td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;}
    tr.even {background-color:white;}
    tr.odd {background-color:#eeeeee;}
            </style>' + 
            '</head>' + 
            '<body><table cellpadding=0 cellspacing=0 border=0>' + 
            '<tr bgcolor=#FFEFD8><td align=center><b>Server Name</b></td>' + 
            '<td align=center><b>Product</b></td>' + 
            '<td align=center><b>Provider</b></td>' + 
            '<td align=center><b>Data Source</b></td>' + 
            '<td align=center><b>Is Linked?</b></td></tr>';

Select @Body = (Select 
        name As [TD],
        product As [TD],
        provider As [TD],
        data_source As [TD …
Run Code Online (Sandbox Code Playgroud)

xml sql-server sql-server-2000 t-sql

3
推荐指数
1
解决办法
1220
查看次数