【问题标题】:Why does this sql function not work with REPLACE?为什么这个 sql 函数不能与 REPLACE 一起使用?
【发布时间】:2012-11-17 18:56:26
【问题描述】:

我的 sql 函数有问题。以下函数按预期运行,但当我替换时,它只返回一行:

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

谢谢:)

【问题讨论】:

  • REPLACE 工作与否与您的功能有何关系?
  • 因为愿望结果是这样的: [DataField("ColumnID")] public Int32 ColumnId { get;放; } -- 其中一种格式以大写 ID 结尾,另一种正确的大小写 -- 也是 REPLACE 关键字阻止它枚举多于一行 -- 所以,它非常重要!

标签: sql sql-server sql-server-2008-r2 sql-function


【解决方案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

【讨论】:

  • 奇怪 - 这是我没有尝试的唯一变化。我很累,但我在想无论是在演员阵容之前更换还是其他方式都没有关系。
  • CAST ... AS VARCHAR 应该是 CAST AS VARCHAR(some length)。见sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/…
  • 我知道他的意思 - 结果函数转换为 NVARCHAR(100) - 就像原来的 sn-p 一样
【解决方案2】:

您的 sql server 是否设置为区分大小写?如果不是(并且我相信它不是默认情况下),那么根据同一个单词的不同大小写替换将不起作用。

查看此链接以将排序规则更改为区分大小写的 How do I change SQL Server 2005 to be case sensitive?

【讨论】:

  • 我不愿意更改整个数据库的排序规则。在什么级别应用排序规则。例如,以下运行但未给出所需结果: PRINT dbo.CreatePocoFromTable('dbo.OnePoundFish') COLLATE Latin1_GENERAL_CS_AS
猜你喜欢
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
相关资源
最近更新 更多