2012-11-17 75 views
1

我遇到了我的sql函數的問題。下面的函數工作作爲預期,但是當我替補,它只返回一行:爲什麼此sql函數不適用於REPLACE?

CAST(t.ColumnName as nvarchar(100)) 

爲:

REPLACE(CAST(t.ColumnName as nvarchar(100)), 'ID', 'Id') 

有什麼不對?這裏是我的調用代碼:

PRINT dbo.CreatePocoFromTable('dbo.OnePoundFish') 

下面是函數本身:

CREATE FUNCTION [dbo].[CreatePocoFromTable] 
    (@SchemaAndName nvarchar(200)) 
RETURNS Nvarchar(MAX) AS 
BEGIN 
/* Example call: 

PRINT dbo.CreatePocoFromTable('dbo.OnePoundFish') 

*/ 

DECLARE @TableName NVARCHAR(100) = SUBSTRING(@SchemaAndName , CHARINDEX('.', @SchemaAndName) + 1, LEN(@SchemaAndName)) 
DECLARE @TableSchema NVARCHAR(100) = SUBSTRING(@SchemaAndName , 1, CHARINDEX('.', @SchemaAndName) - 1) 
DECLARE @result Nvarchar(max) = '' 

SET @result = @result + 'using System;' + CHAR(13) + CHAR(13) 

IF (@TableSchema IS NOT NULL) 
BEGIN 
    SET @result = @result + 'namespace ' + @TableSchema + CHAR(13) + '{' + CHAR(13) 
END 

SET @result = @result + 'public class ' + @TableName + CHAR(13) + '{' + CHAR(13) 

SET @result = @result + '#region Instance Properties' + CHAR(13) 

SELECT @result = @result + CHAR(13) 
    -- BL/DAL/DataRepository Entity attributes 
    + '[DataField("' + t.ColumnName + '")]' + CHAR(13) 
    + ' public ' + t.ColumnType + ' ' + CAST(t.ColumnName as nvarchar(100)) + ' { get; set; } ' + CHAR(13) 

FROM 
(
    SELECT 
     c.COLUMN_NAME AS ColumnName 
     , CASE c.DATA_TYPE 
      WHEN 'bigint' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Int64?' ELSE 'Int64' END 
      WHEN 'binary' THEN 'Byte[]' 
      WHEN 'bit' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Boolean?' ELSE 'Boolean' END    
      WHEN 'char' THEN 'String' 
      WHEN 'date' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END       
      WHEN 'datetime' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END       
      WHEN 'datetime2' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END       
      WHEN 'datetimeoffset' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END          
      WHEN 'decimal' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END          
      WHEN 'float' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Single?' ELSE 'Single' END          
      WHEN 'image' THEN 'Byte[]' 
      WHEN 'int' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Int32?' ELSE 'Int32' END 
      WHEN 'money' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END             
      WHEN 'nchar' THEN 'String' 
      WHEN 'ntext' THEN 'String' 
      WHEN 'numeric' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END                
      WHEN 'nvarchar' THEN 'String' 
      WHEN 'real' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Double?' ELSE 'Double' END                   
      WHEN 'smalldatetime' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END          
      WHEN 'smallint' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Int16?' ELSE 'Int16'END    
      WHEN 'smallmoney' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END                   
      WHEN 'text' THEN 'String' 
      WHEN 'time' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END                 

      WHEN 'timestamp' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END          
      WHEN 'tinyint' THEN 
       CASE C.IS_NULLABLE 
        WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END             
      WHEN 'uniqueidentifier' THEN 'Guid' 
      WHEN 'varbinary' THEN 'Byte[]' 
      WHEN 'varchar' THEN 'String' 
      ELSE 'Object' 
     END AS ColumnType 
     , c.ORDINAL_POSITION 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE c.TABLE_NAME = @TableName and ISNULL(@TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA 
) t 
ORDER BY t.ORDINAL_POSITION 

SET @result = @result + CHAR(13) + '#endregion Instance Properties' + CHAR(13) 

SET @result = @result + '}' + CHAR(13) 

IF (@TableSchema IS NOT NULL) 
BEGIN 
    SET @result = @result + CHAR(13) + '}' 
END 

    RETURN @Result 
END 

謝謝:)

+0

如何'REPLACE',無論工作與否,關係到你的功能? –

+0

因爲慾望結果是這樣的:[DataField(「ColumnID」)] public Int32 ColumnId {get;組; } - 其中一種格式以大寫的ID和另一種適當的大小寫結尾 - 也是REPLACE關鍵字阻止它枚舉多行 - 所以,它非常重要! – CarneyCode

回答

1

只有最有趣的部分的情況下...

SELECT @result = @result + CHAR(13) 
    -- BL/DAL/DataRepository Entity attributes 
    + '[DataField("' + CAST(REPLACE(t.ColumnName , 'ID', 'Id') as nvarchar(100)) + '")]' + CHAR(13) 
-- + '[DataField("' + t.ColumnName + '")]' + CHAR(13) 

    + ' public ' + t.ColumnType + ' ' + CAST(t.ColumnName as nvarchar(100)) + ' { get; set; } ' + CHAR(13) 

FROM 
+0

奇怪 - 這是我沒有嘗試的唯一變體。我很累,但我在考慮在演員演出之前或者其他方面做替換並不重要。 – CarneyCode

+2

'CAST ... AS VARCHAR'應該是'CAST AS VARCHAR(某些長度)'。見http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx –

+1

我知道他的意思 - 結果函數轉換爲NVARCHAR(100) - 就像原始代碼片段一樣 – CarneyCode

0

是SQL服務器設置爲區分大小寫?如果沒有(我相信它不是默認的),那麼根據同一個詞的不同情況進行替換將不起作用。

請參閱此鏈接給整理更改爲敏感的How do I change SQL Server 2005 to be case sensitive?

+0

我不想改變整個數據庫的排序規則。在什麼級別上應用排序規則。例如,以下運行,但不會給出所需的結果:PRINT dbo.CreatePocoFromTable('dbo.OnePoundFish')COLLATE Latin1_GENERAL_CS_AS – CarneyCode

相關問題