SQL 服务器 2012 - 动态 SQL
SQL Server 2012 - Dynamic SQL
有人可以解释为什么下面的查询有效吗?我假设第一个 DECLARE 使用一个足够长的 VARCHAR 来保存 table 名称。但是为什么第二个 DECLARE 使用 VARCHAR,为什么它的相应查询需要包装在 'quotes'?
中
USE Northwind
DECLARE @TableName VARCHAR(25)=
(Select top 1 tab.name
From Sys.tables tab
Where name not like 'dtproperties'
and name not like 'sysdiagrams'
order by tab.name asc)
DECLARE @Output VARCHAR(100) =
'SELECT COUNT(*) AS [CountOf_' + @TABLENAME + ']
FROM [' + @TABLENAME + ']'
EXEC(@Output)
@TableName
的数据类型 VARCHAR(25)
不正确(或者至少是一个糟糕的选择)。大多数对象(表、视图、存储过程、函数等)的数据类型为 sysname
,这是 NVARCHAR(128)
的别名。所以不,第一个 DECLARE 使用的数据类型不仅 不够 ,而且也不能容纳范围广泛的其他有效 Unicode 字符。
第二个 DECLARE 使用 VARCHAR(100)
因为它做出了两个可能错误的假设:
- 永远不会有任何 Unicode 字符,并且
- 表名的长度绝不会超过 62 个字符(即删除该查询中显示的其余字符后剩余的字符数)
查询用引号括起来并通过 EXEC()
提交(即它是动态的 SQL),因为查询的列和表都不能是变量。
有人可以解释为什么下面的查询有效吗?我假设第一个 DECLARE 使用一个足够长的 VARCHAR 来保存 table 名称。但是为什么第二个 DECLARE 使用 VARCHAR,为什么它的相应查询需要包装在 'quotes'?
中USE Northwind
DECLARE @TableName VARCHAR(25)=
(Select top 1 tab.name
From Sys.tables tab
Where name not like 'dtproperties'
and name not like 'sysdiagrams'
order by tab.name asc)
DECLARE @Output VARCHAR(100) =
'SELECT COUNT(*) AS [CountOf_' + @TABLENAME + ']
FROM [' + @TABLENAME + ']'
EXEC(@Output)
@TableName
的数据类型VARCHAR(25)
不正确(或者至少是一个糟糕的选择)。大多数对象(表、视图、存储过程、函数等)的数据类型为sysname
,这是NVARCHAR(128)
的别名。所以不,第一个 DECLARE 使用的数据类型不仅 不够 ,而且也不能容纳范围广泛的其他有效 Unicode 字符。第二个 DECLARE 使用
VARCHAR(100)
因为它做出了两个可能错误的假设:- 永远不会有任何 Unicode 字符,并且
- 表名的长度绝不会超过 62 个字符(即删除该查询中显示的其余字符后剩余的字符数)
查询用引号括起来并通过
EXEC()
提交(即它是动态的 SQL),因为查询的列和表都不能是变量。