2015-02-04 31 views
0

我在T-SQL中有一個變量@ColumnnName用戶定義函數基本上包含列名稱。在TSQL中變量的值LEN

例如:

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本身的長度。

編輯:

完整的查詢是這樣的:如果你想使用上述CASE表達更

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 

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) + '%' 
+1

我認爲你需要動態SQL來實現你想要的。問題是你不能使用UDF中的動態SQL。 –

+0

@GiorgosBetsos:的確如此。必須有一些替代方案嗎? – Simran

+0

一些醜陋的'CASE'構造檢查'@ ColumnnName'的所有可能的值? –

回答

5

這可能是你的問題的解決方案一旦在您的查詢中,那麼您可以將其包裝在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 
+0

Bestos:謝謝了:)其實,我在where子句中有這些case語句。有沒有一種方法可以在此處獲得此值,以避免必須在相同的查詢中再次編寫這些案例聲明? – Simran

+0

@Simran是的,使用CTE或子查詢。 –

+0

@AaronBertrand:非常感謝你與我保持聯繫。我更新了完整查詢的問題。你能指導我的語法嗎?我並不想嘗試使用勺子,但實際上我不知道如何操縱我的查詢。 – Simran

-1

您可以使用EXECUTE命令來運行動態SQL。 假設您有一個字符串var,名爲@myvar並帶有列的名稱。然後,您可以建立一個完整的SQL語句(類似'select '[email protected]+' from tableName;'),然後使用EXECUTE命令,像這樣簡單的例子(從中可以很容易地建立起自己的解決方案):

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

希望這有助於。

+0

不能使用動態SQL。該查詢位於UDF內部。 – Simran

+0

它是否必須在UDF上?我的意思是,如果沒有任何有價值的解決方案,你是否可以扭曲它並將這部分從UDF中拿出來? –