无论如何,我不是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
答案 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))
如果您想在截断时出错,请提前单独检查 如果有最大值,那么最大值......如果你想知道的话,你必须检查一下。