我正在学习数据库操作,我在网上找到了一些资源,这些资源让我有了一个松散的理解,但我自己仍然无法解释其中的区别。请像我五岁那样解释。我想确保我有一个坚实的基础来扩展我的知识。
我有一个游标定义为:
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)
如何在表中获取游标获取的结果?我知道我可以声明两个变量并单独存储结果。但是对于包含许多列的表来说,这将是耗时的。
我将 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) 假设我有三个表或四个表,我想检查存在的值,但我不希望它们中的任何一个为空。如果它们为空,我将每行发送一封电子邮件通知。解决这个问题的最佳方法是什么?我应该单独使用 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
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)
愚蠢的业务规则,我知道我知道......基本上如果“用户”没有指定时间,时间无关紧要(所以它排在列表的底部)。
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) 我有一个临时表#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 …
我有nvarchar 数据类型的经度和纬度列。用户可以输入类似 (23.23424432),(432423.343) 的内容,这是不允许的。
谁能帮我在 SQL Server 中验证这一点?
它应该只接受这种格式:(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) 这是我使用查询返回的结果集:
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 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) t-sql ×10
sql-server ×8
performance ×2
backup ×1
cursors ×1
disk-space ×1
order-by ×1
profiler ×1
regex ×1
xml ×1