如何在SQL Server查询中将变量合并为VARCHAR的SIZE参数

时间:2014-07-10 15:42:30

标签: sql-server

无论如何,我不是SQL Server专家,但有足够的知识让我变得危险。我花了几个小时搜索互联网,找不到我想在这里完成的有效例子。有人可以向我解释为什么以下代码失败?当然,这不是最终用法,但我已经简化了代码以清楚地说明问题。

以下是SQL代码及其结果的副本:

查询:

DECLARE @MaxLength AS INT    
SELECT @MaxLength = 45    
SELECT CAST(site_name AS VARCHAR(@MaxLength)) FROM sites

讯息:

  

Msg 102,Level 15,State 1,Line 3'@MaxLength'附近的语法不正确。

当我用一个文字整数(例如45)代替局部变量(@MaxLength)时,它可以正常工作,如下所示:

查询:

--DECLARE @MaxLength AS INT    
--SELECT @MaxLength = 45    
SELECT CAST(site_name AS VARCHAR(45)) FROM sites

讯息:

  

(1550行受影响)

如上所述,为了清楚起见,我简化了代码示例,但最终的代码块将呈现多列输出并且绑定为8 1/2 x 11张纸。 我的目标是在不截断数据的情况下将输出的列宽强制为最小宽度。这就是VARCHAR(MAX)不是解决方案的原因。下面是将在最终查询中出现的更大一部分代码,这可能会澄清我正在尝试完成的任务:

DECLARE @MaxLength AS INT
SET @MaxLength = (SELECT MAX(LEN(site_name)) FROM sites)
SELECT CAST(site_name AS VARCHAR(@MaxLength)) AS site_name, CAST(customer_name AS CHAR(40)) AS customer_name, CAST(remote_agent_name AS CHAR(35)) AS RA_Name, CAST(subtype_name AS CHAR(20)) AS subtype_name
FROM sites, customers, remote_agent, remote_agent_subtype

2 个答案:

答案 0 :(得分:1)

您必须使用动态SQL来完成此任务。

然而,正如Aaron Bertrand在Bridge共享链接中所述,很难想象这样做的理由不是仅使用你知道永远不会超过的大数字,例如8000或MAX。

答案 1 :(得分:0)

根据您所描述的内容,我想知道是否有更直接的答案。

如果要在SELECT期间修剪列,为什么不

SUBSTRING()  

http://msdn.microsoft.com/en-us/library/ms187748(v=sql.105).aspx

所以如果你想确保它也尽可能小(varchar点),当然你也可以放一个RTrim ......

declare @caseMaxLen int;
select @caseMaxLen = 3;

select 
    rtrim(substring('mystring', 1, @caseMaxLen))  

如果您想在截断时出错,请提前单独检查 如果有最大值,那么最大值......如果你想知道的话,你必须检查一下。