2012-04-03 38 views
9

से तिथि और/या समय परिवर्तित मैं एक मेजरूपांतरण विफल जब चरित्र स्ट्रिंग

ALTER PROCEDURE mytable.[news_editor_paginate] 
    @count int, 
    @start int, 
    @orderby int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT TOP (@count) * FROM 
    ( 
     SELECT news_edits.*, 
     ROW_NUMBER() OVER (
      ORDER BY CASE 
       WHEN @orderby = 0 THEN news_edits.[time] 
       WHEN @orderby = 1 THEN news_edits.lastedit 
       WHEN @orderby = 2 THEN news_edits.title 
       END 
      DESC 
     ) AS num 
     FROM news_edits 
    ) AS a 
    WHERE num > @start 
END 

@orderby पैरामीटर का फैसला करता है जो स्तंभ परिणाम द्वारा आदेश दिया जाना चाहिए से पंक्तियां प्राप्त करने के लिए प्रयोग किया जाता एक अत्यंत साधारण पृष्ठांकन क्वेरी की है।

news_edit.[time] और news_edits.lastedit दोनों डेटाटाइम फ़ील्ड हैं। लेकिन news_edits.title एक वर्चर फील्ड है।

क्वेरी दोनों datetime क्षेत्रों के लिए ठीक चलता है, लेकिन जब @orderby = 2 मैं निम्नलिखित त्रुटि मिलती है:

"रूपांतरण में विफल रहा है जब चरित्र स्ट्रिंग से तिथि और/या समय परिवर्तित।"

मेरी समस्या यह है कि मैं कुछ भी बदलने की कोशिश नहीं कर रहा हूं?

उत्तर

19

You'll need to divide your ORDER BY into multiple CASE statements:

ORDER BY 
    CASE WHEN @orderby = 0 THEN news_edits.[time] END DESC, 
    CASE WHEN @orderby = 1 THEN news_edits.lastedit END DESC, 
    CASE WHEN @orderby = 2 THEN news_edits.title END DESC 

इसका कारण यह है एक CASE बयान की आवश्यकता है कि सभी शाखाओं संगत डेटा प्रकार की है। चूंकि आपके चरित्र स्ट्रिंग को CASE में किसी अन्य CASE से लौटाए गए दिनांक समय में परिवर्तित नहीं किया जा सकता है, तो आपको रूपांतरण त्रुटि मिलती है।

+0

यह शुक्रिया है! –

0

जैसा कि आप स्पष्ट रूप से "केस द्वारा ऑर्डर ..." मानों कास्टिंग नहीं कर रहे हैं, SQL सर्वर का अनुमान है कि यह एक डेटाटाइम है (पहले मामले के प्रकार के अनुसार)।

आपकी समस्या का समाधान एक स्ट्रिंग प्रारूप में तिथियों को डालना है जो आपको इसके द्वारा आदेश देने की अनुमति देता है, कुछ हद तक 'yyyyMMddhhmmss'। यदि आप ऐसा करते हैं, तो सभी "केस द्वारा क्रम ..." मान वर्ण होंगे और यह काम करेगा।

वैकल्पिक रूप से, आपके पास दो चयन हो सकते हैं, और उनमें से एक को एक के साथ चुन सकते हैं। तारीखों के लिए यदि पहले शीर्षक का पहला भाग है।

संबंधित मुद्दे