MS SQL 语法 SET 与 SELECT

MS SQL syntax SET vs. SELECT

我正在尝试遵循以下 SQL 查询(部分代码):

DECLARE @name VARCHAR(50)       -- database name  
DECLARE @path VARCHAR(256)      -- path for backup files  
DECLARE @fileName VARCHAR(256)  -- filename for backup  
DECLARE @fileDate VARCHAR(20)   -- used for file name 

SET @path = 'C:\Backup\'
SET @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 

DECLARE db_cursor CURSOR FOR  
    SELECT name 
    FROM MASTER.dbo.sysdatabases 
    WHERE name NOT IN ('master','model','msdb','tempdb')

我的问题:

  1. 为什么 @path 使用 SET,而 @fileDate 使用 SELECT
  2. 为什么 @fileDate SET 也不是?

在您的示例中,Set 或 Select 是相同的。 Select 用于选择多个变量的值,如下所示

这个有效

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) ,@path = 'C:\Backup\'

但这不起作用

set @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) ,@path = 'C:\Backup\'

在你的情况下,我看不出原因。如果我想一次设置多个值,我会使用 Select 而不是 Set 的原因之一。

DECLARE @name VARCHAR(50) -- database name  
DECLARE @path VARCHAR(256) -- path for backup files  
DECLARE @fileName VARCHAR(256) -- filename for backup  
DECLARE @fileDate VARCHAR(20) -- used for file name 

--SET @path = 'C:\Backup\'  

Select  @path = 'C:\Backup\' , @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)

Select @Path, @FileDate

因为它是一个备份查询

SET @path = 'C:\Backup\' --- 这意味着我们正在静态路径上进行备份

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) --- 由于 getdate() 的缘故,filedate 将是动态的,它可以用于 .bak 文件命名约定所以这就是为什么我们大多使用 select 作为 @filedate

例如如果每天执行一次备份。

然后它可能会提供静态路径 (@path) 上的备份和带有命名约定的备份,例如____bkup_20160519.bak

这里的 20160519 是@filedate,每天都会变化

如果您需要更多关于它的想法,请告诉我。