SQL中变量的值为LEN

时间:2015-02-04 21:49:21

标签: sql sql-server tsql ssms

我在T-SQL 用户定义函数中有一个变量@ColumnnName,它基本上包含列Name。

例如:

declare @ColumnnName= 'firstName'

这意味着我的表中有一个名为firstName的列,并且此列名存储在名为@ColumnnName的变量中。

我有这样的查询:

Insert into @Temp([Row], VarLength) select  Rowid, LEN(@ColumnnName) from Patients
 where 
/ 
*rest of code 
*/

在上面的查询中,LEN(@ColumnnName)将返回9,这是firstName的长度,但不是firstName列中包含的值。

如何获取包含firstName列的值的长度,而不是字符串firstName本身的长度。

编辑:

完整查询是这样的:

Insert into @Temp([Row], Counts, VarLength) select  Rowid, @counter, LEN(@ColumnnName) from Patients where 
(case when @ColumnnName = 'firstname' then firstname 
            when @ColumnnName = 'middlename' then middlename 
            when @ColumnnName = 'lastname' then lastname 
            when @ColumnnName = 'State' then [State] 
            when @ColumnnName = 'City' then City 
            when @ColumnnName = 'StreetName' then StreetName 
            when @ColumnnName = 'StreetType' then StreetType end) LIKE SUBSTRING(@parameterFromUser, 1, @counter) + '%'

2 个答案:

答案 0 :(得分:5)

这可能是您问题的解决方案:

INSERT INTO @Temp([Row], VarLength) 
SELECT Rowid, CASE WHEN @ColumnnName = 'FirstName' THEN LEN(FirstName)
                   WHEN @ColumnnName = 'LastName' THEN LEN(LastName)
                   ... etc
              END AS len
FROM Patients
... etc

如果您想在查询中多次使用上述CASE表达式,则可以将其包含在CTE中:

;WITH CTE AS (
   SELECT Rowid, CASE WHEN @ColumnnName = 'FirstName' THEN LEN(FirstName)
                      WHEN @ColumnnName = 'LastName' THEN LEN(LastName)
                      ... etc
                 END AS len
   FROM Patients
)
INSERT INTO @Temp([Row], VarLength)
SELECT Rowid, len
FROM CTE

答案 1 :(得分:-1)

您可以使用EXECUTE命令运行动态SQL。 假设您有一个名为@myvar的字符串var,其名称为列。然后,您可以构建一个完整的SQL语句(类似'select '+@myvar+' from tableName;'),然后使用EXECUTE命令,就像这个简单的例子一样(您可以从中轻松构建解决方案):

BEGIN
  DECLARE @temp NVARCHAR;
  SET @temp = 'getdate()';
  EXECUTE ('select '+@temp+';');
END;

希望这有帮助。