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)
  1. @TableName 的数据类型 VARCHAR(25) 不正确(或者至少是一个糟糕的选择)。大多数对象(表、视图、存储过程、函数等)的数据类型为 sysname,这是 NVARCHAR(128) 的别名。所以不,第一个 DECLARE 使用的数据类型不仅 不够 ,而且也不能容纳范围广泛的其他有效 Unicode 字符。

  2. 第二个 DECLARE 使用 VARCHAR(100) 因为它做出了两个可能错误的假设:

    1. 永远不会有任何 Unicode 字符,并且
    2. 表名的长度绝不会超过 62 个字符(即删除该查询中显示的其余字符后剩余的字符数)
  3. 查询用引号括起来并通过 EXEC() 提交(即它是动态的 SQL),因为查询的列和表都不能是变量。